-
LEVEL 13 bugbear write-upSystem hacking training/Hackerschool LOB 2018. 4. 26. 01:54
darkknight -> bugbear
[문제 + 힌트]
문제를 보면 bof는 터지지만 argv[1][47]의 값이 bf라면 예외처리가 되며 종료되기 때문에
ret에 스택의 주소 말고 다른 영역의 주소를 적어야할것같다.
힌트 부분을 보면 알다시피 이 문제는 RTL을 이용하여 풀면된다.
페이로드는
`python -c 'print "A(dummy)" * 44 + "system() address" + "dummy 값" * 4 + "/bin/sh\00"'`
이런식으로 구성하면 된다.
이 페이로드를 작성하기 위해 준비물이 필요한데
system()의 주소와 system()에 인자로 줄 /bin/sh\00가 필요하다.
그전에 이 바이너리가 static linked 인지 dynamic linked 인지 알기 위해 file 명령어로 확인하였다.
이 바이너리에 대한 정보중 dynamic linked 즉, 공유라이브러리를 사용하는 바이너리임을 알 수 있다.
이로써 위의 바이너리에서 사용되지 않은 system()를 사용할 수 있다.
gdb를 이용하여 system()의 주소를 구할 수 있다
만약 ASLR이 걸려있다면 주소가 계속 변경되기 때문에 libc base주소를 구하고 여기에 system()의 offset을 구하여 익스해야하지만
ASLR이 걸려있지 않기 때문에 그냥 ret에 넣어주면 된다.
이제 /bin/sh\00을 인자로 넘겨주기 위해서 dummy값 4byte를 넣어주는데
이 위치에는 다음에 return 할 주소를 가리키고 있기 때문이다.
다음에 return 할 주소가 없기때문에 AAAA (dummy)로 채워줬다.
이제 system()에 인자로 줄 /bin/sh\00 문자열을 찾아보자.
먼저 libc 파일의 이름을 알기 위해 ldd 명령어로 이름을 찾고 libc의 base address도 구해준다.
(/bin/sh\00의 문자열을 찾아 offset을 더할 목적)
objdump -s 옵션을 줘서 /bin/sh\00의 offest을 구해보니
0xe8778의 offset을 가진 /bin/sh\00 문자열을 찾아냈다.
이 offset을 libc base 주소에 더하면 이 문자열에 대한 주소가 나오는데 그 주소는 0x40100778이다.
(libc : 0x40018000 + offset : 0xe8778 = 0x40100778)
이제 익스플로잇에 필요한 준비물들을 다 구했으니
익스해보자.
이상 풀이를 마친다.
반응형'System hacking training > Hackerschool LOB' 카테고리의 다른 글
LEVEL 15 assassin write-up (0) 2018.05.13 LEVEL 14 giant write-up (0) 2018.05.12 LEVEL 12 darkknight write-up (0) 2018.04.22 LEVEL 11 golem write-up (0) 2018.04.20 LEVEL 10 skeleton write-up (0) 2018.04.11