2019. 4. 24. 00:34ㆍSystem Hacking/ROP(64byte)
안녕하세요!
오늘은 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 |