2019. 4. 6. 18:00ㆍSystem Hacking/[LOB] Hacker School
안녕하세요!
오늘은 LOB 15번 문제인
giant 문제풀이를 해보도록 하겠습니다!
소스는 아래와 같습니다!
RTL도 못하고 Stack도 사용 못한다고 적혀있네요!
1) 버퍼 [40] 선언되고
2) argument 는 2개 이상!
3) argv[1]의 48번째 값이 \xbf면
exit되고 (stack으로 return 하지마라)
4) argv[1]의 48번째 값이 \x40이면
exit되고 (library로 return 하지마라)
5) 버퍼도 깔끔하게 비우네요!
저는 여기서 최대한 나에게 주어진 조건이 뭔지
판단해봤습니다
1) return 뒤에 코드를 덮을 수 있고
(이게 굉장히 큰 merit)
2) argv[ ]들을 초기화 안 함
근데 return 뒤에 코드를 덮을 수 있으니
return에 pop pop return gadget을 넣으면
FTZ 19번처럼
새로운 곳에서 return이 가능할텐데!!!
(=return 우회)
그래서 objdump 명령어를 통해서
혹시나 pop pop return gadget이 있나 확인해봤는데....
그래서 생각을 좀 하다가
떠오른 게
RET SLED을 이용하면 되겠구나!
※간단하게 설명하면
return 주소에 return 주소를 넣는 거에요!
그러면 ret+4 주소에서 ret이 일어나요!
상황 1) ret <- esp
ret+4
통상적으로 ret을 하면
pop eip를 해서
esp가 아래와 같이 내려가요!
상황 2) ret + 4 <-- esp
그리고 이 상황에서
ret의 마지막 명령어 jmp eip
(eip엔 return gadget이 들어가있음)
그러면 ret이 한번 더 일어나서
ret+4가 eip로 가서 return 조작 가능해요!
pop eip, jmp eip가 한번 더 일어나기 때문이죠!
gdb 사진 넣은 이유는 스택구조 보다가 생각났어서...
자 그러면 ret을 조작할 수 있게 되었는데!
어떻게 문제를 풀까요?
system 함수 rtl로도 풀 수 있고
execve로도 풀 수 있고
뭐 다양하게 있겠지만
저는 제가 아까 말한 두 번째 조건
argv[ ] 초기화 안 한거를 활용할게요!
argv[1]의 주소를 찾기 위해서
아래와 같이 \x90과 쉘코드를 넣고
main에 breakpoint를 걸고!
x/2x 0xbffffb24 명령어를 통해서
0xbffffc30에 저희가 입력한
\x90과 쉘코드가 있는 것을 확인했습니다!
그러면 payload는 끝났죠
\x90 + 25byte쉘코드+\x90 [44byte] + gdb에서 있는 ret 주소 [4 byte] + argv[1] 주소 [4byte]
그랬더니 아래와 같이 exploit이
완료되었습니다!
고생하셨습니다!
'System Hacking > [LOB] Hacker School' 카테고리의 다른 글
[어설픈] LOB 17번 zombie_assassin 문제풀이 (0) | 2019.04.10 |
---|---|
[어설픈] LOB 16번 assassin 문제풀이 (0) | 2019.04.08 |
[어설픈] LOB 14번 bugbear 문제풀이 (0) | 2019.04.04 |
[어설픈] LOB 13번 darkknight 문제풀이 (0) | 2019.04.02 |
[어설픈] LOB 12번 golem 문제풀이 (0) | 2019.03.30 |