-
[HackCTF] 내 버퍼가 흘러넘친다!!! Write-up표튜터와 함께하는 Pwnable/HackCTF Write-up 2019. 4. 18. 02:12
이번에 풀 문제는 "내 버퍼가 흘러넘친다!!!" 이다.
문제를 실행시켜보도록 하자~~
Name과 input이 출력되고 두 번 입력을 받고 있다.
이번에는 IDA로 코드를 살펴보았다.
read함수와 gets함수로 입력을 받고 있다는 것을 알 수 있다.
read 함수로 입력을 받는 name의 경우 전역변수이므로 BSS영역에 존재한다.
gets함수로 S 버퍼에 입력을 받기 때문에 길이제한이
없으므로 이곳에서도 충분히 버퍼오버플로우를 일으킬 수 있다.
첫 번째로 시도한 방법의 Payload는 다음과 같다.
S 버퍼의 크기가 존재함에도 gets함수를 사용했기 때문에
s와 sfp의 크기를 더미값으로 채우고 ret를 버퍼 s 다음의 주소를 준다.
그 다음 쉘코드를 넣는 방식으로 payload를 구성하였다.
첫 번째 입력 payload = dummy..
두 번째 입력 payload = dummy(24) + ret(shellcode addr) + shellcode
< Payload >
버퍼의 주소는 동적디버깅을 해보니 기존과 달라져서 저렇게 써준것이다.
< 디버깅 >
하지만 이 방법은 localhost에서는 성공하였으나
직접 서버에 시도할 때는 실패하였다. 흠... 왜일까???(막아놓은 것인가?? 아마 ASLR일 것 같다.)
그래서 다른 방법을 사용해보기로 하였다. 그것은 바로 name을 이용하는 것이였다.
name은 전역변수로 초기화값이 없어서 bss영역에 존재하며 고정주소 영역을 사용하고 있었다.
name에 쉘코드를 넣어놓고 ret값으로 name의 주소를 주는 것이였다.
첫 번째 입력 payload = shellcode
두 번째 입력 payload = dummy(24) + ret(name addr(shellcode가 들어있음))
read함수로 name을 입력받기 때문에 저 주소가 name이라는 것을
알 수 있었다. 또한 크기 0x32(50)도 넘어가는 것을 확인하였다.
이제 ret 위치를 구해보자~~
"b"를 20개 넣어보았다. ret값이 0xffffd0dc이므로 우리는 저 값을
name의 주소로 바꾸어주면 된다.~
< payload >
FLAG를 딸 수 있었다~~
반응형'표튜터와 함께하는 Pwnable > HackCTF Write-up' 카테고리의 다른 글
[HackCTF] Simple_Overflow_ver_2 Write-up (0) 2019.04.19 [HackCTF] x64 Simple_size_BOF Write-up (0) 2019.04.18 [HackCTF] x64 Buffer Overflow Write-up (0) 2019.04.18 [HackCTF] Basic_BOF#2 Write-up (0) 2019.04.17 [HackCTF] Basic_BOF#1 Write-up (0) 2019.04.17 댓글