티스토리 뷰

이번에는 스택도 RTL도 이용할 수 없습니다.

소스코드를 한 번 보시면,

리턴주소의 맨 처음 바이트에 스택과 공유라이브러리 영역에 대한 것을 원천차단해놨군요...
하지만 ! argv[1]와 환경변수 모두를 차단하지는 않았습니다. 즉, 두 개 모두 사용해야 풀 수 있는 것 같습니다.
문제 12번을 제대로 이해하시고 직접 해보셨다면 풀면서 확 ! 떠오르는게 있으실 수도 있습니다만...
바로 설명드리겠습니다.
leave; ret 에 대한 내용은 모두 아신다고 가정하고 ret의 동작에 대해서만 다시 한 번 살펴보죠.
ret: pop eip; jmp eip -> 와 같이 동작한다고 설명해드렸습니다. 또한, pop을 하므로 esp의 값이 4 바이트만큼 증가한다고 설명했었구요.
뭔가 아이디어가 떠오르시지 않으시나요 ? 그렇습니다. ret에 ret을 한 번 더 넣어주면... 원래 ret 값의 4 바이트 뒤의 부분을 사용할 수 있게 됩니다.

leave와 ret에 브레이크포인트를 걸고 수행 중인 장면입니다. ret에 브레이크포인트가 걸린 상태로 멈춰있으며, esp 값은 0xbffffadc이고 ret이 수행되면 0x41414141 주소로 점프합니다.
그런데 ret을 0x41414141이 아닌 Text 영역에 있는 ret으로 한 번 더 점프하면 어떻게 될까요 ?

gdb의 set명령으로 ret 값을 다시 ret로 뛰게한 후에 continue를 하니 esp의 값이 4 바이트만큼 증가했습니다.
이제 다시 한 번 실행하면 원래의 ret 뒤의 값인 0x00000000을 실행하려고 할 것입니다.

예상대로입니다. 그럼 이제 뒷 부분에 쉘코드를 넣고 점프해봅시다 !

많이 하시는 실수 중에 ret 뒤에 쉘코드를 넣으시는 분들 있으신데 ret 뒤에는 점프 할 주소를 넣어야합니다 !
도중에 ret의 주소가 바뀌어서 gdb로 재확인하고 공격하였습니다 ~ 성공 !


댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함