BUUCTF-get_started_3dsctf_2016
方法1:
get_flag的返回地址,这个地址不能乱写,打远程时,如果程序是异常退出了,最后是不给你回显的。所以我们得想办法让程序正常退出。
C语言有个函数是exit,只要执行这个只要我们把get_flag的返回地址写成exit的地址,程序就可以结束并且有回显了。
32 位程序 payload = offset + 函数地址 + 返回地址 (一定要是 exit 函数的地址) + 参数
方法2:
有这么一个函数,mprotect,我们先来学习一下。
int mprotect(const void *start, size_t len, int prot);
第一个参数填的是一个地址,是指需要进行操作的地址。
第二个参数是地址往后多大的长度。
第三个参数的是要赋予的权限。
mprotect()函数把自start开始的、长度为len的内存区的保护属性修改为prot指定的值。
prot可以取以下几个值,并且可以用“|”将几个属性合起来使用:
1)PROT_READ:表示内存段内的内容可写;
2)PROT_WRITE:表示内存段内的内容可读;
3)PROT_EXEC:表示内存段中的内容可执行;
4)PROT_NONE:表示内存段中的内容根本没法访问。
prot=7 是可读可写可执行
ssize_t read(int fd, void buf, size_t count);
fd 设为0时就可以从输入端读取内容
buf 设为我们想要执行的内存地址
size 适当大小就可以
payload1= b"A"0x38+p32(mprotect地址,跳转到函数执行)+p32(gadget,mprotect需要三个参数,我们可以查找合适的gadget)+p32(memaddr,被修改的内存地址)+p32(0x100,被修改的内存大小)+p32(0x7,内存权限rwx,二进制111,也就是7)+p32(read,返回到read函数地址)+p32(memaddr,read函数的返回地址)+p32(0,read函数的参数1)+p32(memaddr,read函数的参数2)+p32(0x100,read函数的参数3)+p32(memaddr,指向修改的内存地址)

浙公网安备 33010602011771号