level14

해커스쿨 FTZ 2018. 3. 28. 16:52

이번 문제의 힌트는

이다.


스택 구조상 



buf

check

crap

으로 되어있을것이므로 fgets를 이용해 check부분을 0xdeadbeef로 오버플로우시키면 쉘을 얻을 수 있을 것이다.



메인을 디스어셈블해보면 main+3에 sub 0x38이 보인다. 이는 십진수로 56이다.


코드상으론

int 형 변수 2개와 char 형 buf[20]이 선언되었으므로 4+4+20 총 28이 선언되었지만 실제론 56이 할당된걸 볼 수 있다.


스택이


---------------

buf

---------------

check

---------------

crap

---------------

dummy

---------------

sfp(여긴 계속 까먹..)

---------------

ret


처럼 되어있다면 간단하게 20바이트를 채우고 0xdeadbeef를 넣겠지만

사실 더미값은 변수들 사이사이에도 있다.


이를 알아보기 위해 한참 뒤져보다가

한 선배의 도움으로

set disassembly-flavor intel

이라는 명령어를 알게 되었다.


이 설정을 해주고 disas main을 해주면 

코드가 이렇게 ollydbg에서 보던 익숙한 모습으로 보이게 되는데

여기서 cmp가 있는 main+29를 보면 0xdeadbeef와 ebp-16을 비교하는 것을 볼 수 있다.


총 할당된것이 56인데 그중 -16해서 비교하는 것을 보면 check가 뒤에서 16바이트 전에 위치함을 알 수 있었다.


그리해서 아무값이나 40바이트 채우고 0xdeadbeef를 입력하였다.

그러자 쉘을 얻을 수 있었다.

'해커스쿨 FTZ' 카테고리의 다른 글

level16  (0) 2018.04.02
LEVEL15  (0) 2018.03.29
level13  (0) 2018.03.28
level12  (0) 2018.03.28
level11  (0) 2018.03.27
블로그 이미지

천재보다는 범재

,

level13

해커스쿨 FTZ 2018. 3. 28. 14:59

이제는 거의 공식이 되어버린 hint파일로 컴파일하기...

우선 gdb로 main을 디스어셈블해보았다.


main+3의 0x418은 demical로 1048이다. 코드에서 요청한 1024에 더미 24가 추가된것을 볼 수 있다.


그리고 밑에 main+19를 보면 long i =0x1234567이 그대로 들어가는 것을 볼 수 있다.


main+76에 bp를 걸고 run해보았다.



입력한 A들이 0xbfffeb00부터 입력되어 있는것을 알 수 있다.


i가 어디저장되어있는지 찾기 위해 A를 1024개 입력해 보았다.



0xbfffef40: 줄에 마지막에 0x01234567이 있는것이 보인다. 이것이 수정되면

이렇게 버퍼오버플로우가 되었다고 하면서 프로세스를 kill해버린다.


그래서 0x01234567의 위치를 고려해서

`python -c 'print "\x90"*950 + "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80"+"\x90"*61 + "\x67\x45\x23\x01" + "\x90"*12 + "\x50\xeb\xff\xbf"'`

로 파이썬 코드를 짰다.


사실 환경변수를 사용하기에 중간에 쉘코드를 넣을 필요는 없었지만 처음엔 메모리 내에 ret해서 실행해보고자 하였기에 코드가 저렇게 되었다.


환경변수를 설정하고

주소를 찾는 코드를 짜고


ret을 해당 주소로 오버플로우 햇더니 쉘을 얻을 수 있었다.


해결!

'해커스쿨 FTZ' 카테고리의 다른 글

LEVEL15  (0) 2018.03.29
level14  (0) 2018.03.28
level12  (0) 2018.03.28
level11  (0) 2018.03.27
level10  (0) 2018.03.26
블로그 이미지

천재보다는 범재

,

level12

해커스쿨 FTZ 2018. 3. 28. 13:54

이번에도 hint파일을 tmp폴더에 복사해서 컴파일 했다.


이번에는 gets함수가 있다. 컴파일할떄 gets를 쓰지 말라고 할 정도로 위험한 함수라고 한다.


우선 gdb로 main을 보았다.


보면 main+66에 gets함수가 있는 것을 볼 수 있다.

그 바로밑인 main+71에 BP를 걸고 run해 보았다.


264byte이상을 입력해서 segmentation fault가 뜬 것 같다.


이 상태에서 esp를 확인해 보았다.


0xbfffdf60부터 0x41이 반복되는 것을 볼 수 있다.


0x41은 아스키코드상 A를 의미하므로 내가 입력한 값인 것을 알 수 있다.



이를 이용하여 0xbfffdf60부터 243바이트를 0x90으로 채우고 나머지 25바이트를 쉘코드를 채운 후 ret을 0xbfffdf60로 오버플로우 하였다.


그러자 이상한 문장이 뜨며 No such file or directory가 뜬다.


혹시나 gdb를 다시돌려보니 0x41이 시작하는 주소값이 계속 변하는걸 볼 수 있었다. 어떻게 해결할지 고민하던중 환경 변수에 대해 알게 되었다.




이렇게 SHELLCODE라는 환경변수를 만들었다. 구조는 \x90 243개 후 쉘코드를 넣었다.


그리고 이 환경변수의 주소를 알아야 하기 때문에

이렇게 주소를 출력하는 프로그램을 코딩, 컴파일 하였다.


이렇게 주소가 0xbfffb37이라는 것을 알았으니 이제 BOF를 다시 해보았다.


'A' 268개로 sfp까지 모두 덮은 후 ret에다가 환경변수의 주소를 넣었다.


그랬더니 왼쪽에 쉘표시가 뜨지는 않지만 권한을 얻었고, 비밀번호도 알 수 있었다.


ps. 첫번째 방법으로 어떻게 하는지 아직도 잘 모르겠다. level11의 경우는 그냥 r하고나서 x/1000x $esp하면 esp를 보여줬는데 이번문제는 r하고 나서 문자열 입력하고 나면 프로그램이 아얘 종료되는지 esp가 나오지 않았다.

'해커스쿨 FTZ' 카테고리의 다른 글

level14  (0) 2018.03.28
level13  (0) 2018.03.28
level11  (0) 2018.03.27
level10  (0) 2018.03.26
level9  (2) 2018.03.26
블로그 이미지

천재보다는 범재

,