例子
https://github.com/scwuaptx/HITCON-Training/tree/master/LAB/lab6
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int count = 1337 ;
int main(){
if(count != 1337)
exit(1);
count++;
char buf[40];
setvbuf(stdout,0,2,0);
puts("Try your best :");
read(0,buf,64);
return 0;
}
gcc -m32 -z relro -z now -fno-stack-protector -mpreferred-stack-boundary=2 -no-pie a.c -o a
之前方法的问题
buf只有40B,但是却read了64B,这里发生了栈溢出
实际测试得到offset=44,所以只有20B可以写exp
ret2text没有对应的函数
ret2shellcode有read函数,bss有写权限,可以read在bss中写入shellcode,然后write返回到bss,但是长度超过了24B
ret2libc:泄露地址什么的可以使用puts泄露地址,count限制了执行次数,那就利用read修改count然后再执行main
但是很可惜,超过长度了,20B只能写下5个数值
再次执行main

本文介绍了栈溢出问题及其解决方案——栈迁移。在CTF挑战中,由于buf大小限制,传统的栈溢出方法无法实现。栈迁移通过覆盖ebp并利用leave; ret指令将esp劫持到新的栈位置,解决了可溢出空间不足的问题。文章通过实例讲解了栈迁移的原理和应用,并指出栈迁移在构造执行ROP链时的重要性。
最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



