ROP (64byte) 문제 2번

2019. 4. 24. 00:34System Hacking/ROP(64byte)

prob2

안녕하세요!

오늘은 ROP 64bit 

2번 문제를 풀어보도록 하겠습니다!

파일은 위에 있습니다!


소스코드는 1번문제와 크게 달라진 것은 없습니다!

vuln 함수는 여전히 버퍼 크기가 16byte인데

256 byte를 읽어서 오버플로우가 일어나고


저희는 run 함수로 return 합니다!

근데 run 함수에 이번에는 인자 arg가 있네요!

arg의 값이 0x31337이여야 

쉘이 따지네요!



payload를 작성하기 전에

checksec 명령어를 통해서 

prob2 파일의 보호기법을 확인해보겠습니다!


근데 1번과 같이

Partial RELRO (GOT overwrite 가능)

Canary X (canary 기법 없음) 

NX enabled (스택의 실행권한 없음)

NO PIE  (바이너리 영역을 랜덤하게 배치)


보호기법은 똑같이 걸려있네요!



근데 ROP를 할 때 저희가 필요한 

gadget이 필요합니다!


32bit에선 함수의 인자를 

"스택에서" ebp+8 인 위치에 넣었는데


64bit에선 함수의 인자를 

스택에 백날 넣어봤자 소용없고,

"Register"에 넣어야 합니다!


1번째 인자에 넣으려면 rdi

2번째 인자에 넣으려면 rsi

3번째 인자에 넣으려면 rdx

4번째 인자에 넣으려면 rcx

각각 넣어야 합니다!


따라서 저희는 

pop rdi

pop rsi 

pop rdx 

이런 명령어(=gadget)이 필요합니다


저희는 prob2 파일 exploit 할꺼기 때문에,

prob2에서 이러한 gadget들이 있는지 확인해야 합니다!


그래서 objdump -d ./prob2를 통해서 

가젯이 무엇이 있는지 확인해보았습니다! 

근데 pop이 있긴 한데,

저희가 원하는 

pop rdi는 없네요!


run의 첫 번째 인자에  넣는거라 

pop rsi, rdx, rcx

모두 쓸모 없습니다...


혹시 몰라서 검증하기 위해서 

objdump 한 결과에서 grep으로 

pop을 쭉 뽑아봤습니다!

근데 그래도 없네요.... 



그래서 어떻게 할까? 

고민을 하다가 run 함수를 

disas(disassemle) 해봤습니다!


그러다가 

만약 return을 

run+20으로 하면 어떻게 될까? 라고

생각을 해봤습니다!


그렇게 되면 if arg=0x31337을 이미 통과한 상태에서

바로 system함수(인자는 /bin/sh)가 불러지잖아요!


그래서 바로 exploit 코드를 작성해보았습니다!


1번에서 했던거와 같이 

from pwn import * 세팅해주시고

prob2의 ELF 파일을 읽어서 e에 저장하고

p는 process의 약자로 e.path에서 가져옵니다


payload는 빈칸 ''에서 시작해서

gdb에서 확인한 크기대로


버퍼 16

ebp 8

ret 8


24 byte의 더미를 a로 주고요!

그리고 저희가 말한 

run+20으로 return 하는

payload를 완성합니다!


e.symbols['run'] => run 함수의 시작주소

따라서 여기에 +20을 해야 저희가 원하는 곳!


그리고 1번에서 말한 것과 같이

payload을 작성했으면 

보내야죠?


p.send(payload)


그리고 제대로 되면,

shell이 나타날 것이므로

이 shell과 communicate 하기위해서

p.interactive()를 적어줍니다!



그리고 아래와 같이 exp2.py를 

실행하면!


shell이 따진 것을 

확인 할 수 있습니다!


고생하셨습니다!



'System Hacking > ROP(64byte)' 카테고리의 다른 글

ROP (64byte) 문제 4번  (0) 2019.04.27
ROP (64byte) 문제 3번  (0) 2019.04.26
ROP (64byte) 문제 1번  (0) 2019.04.22