linux2.6 gcc,在Linux内核 2.6.38.7 上,gcc堆栈粉碎代码不工作 请帮助_gcc_开发99编程知识库...
若要禁用堆棧smash檢測,請在編譯時使用 -fno-stack-protector 。 你可能還希望在通過"。Shellcoders手冊"處理時使用-ggdb和-mpreferred-stack-boundary=4來啟用GDB符號並規範堆棧。
編輯:當我編譯你提供的代碼時( gcc -fno-stack-protector -ggdb -mpreferred-stack-boundary=4 -o sc in.c ) 編譯器重新排列了 function 中局部變數的順序。 我通過使用GDB找到了這個:willi@ubuntu:~/testing$ gdb sc
(gdb) set disassembly-flavor intel
(gdb) disassemble function
Dump of assembler code for function function:
0x080483c4 : push ebp
0x080483c5 : mov ebp,esp
0x080483c7 : sub esp,0x20
0x080483ca : lea eax,[ebp-0xc]
0x080483cd : add eax,0x6
0x080483d0 : mov DWORD PTR [ebp-0x4],eax
0x080483d3 : mov eax,DWORD PTR [ebp-0x4]
0x080483d6 : mov eax,DWORD PTR [eax]
0x080483d8 : lea edx,[eax+0x8]
0x080483db : mov eax,DWORD PTR [ebp-0x4]
0x080483de : mov DWORD PTR [eax],edx
0x080483e0 : leave
0x080483e1 : ret
End of assembler dump.
0x080483ca告訴我 ebp - 0xC 是 buffer1,0 x080483d0告訴我 ebp - 0x4 是正確的。 因此,這些變數不存在於堆棧中,因為它們存在於我們的C 代碼中。 假設 ret 是我們最主要的局部變數,我們可以直接使用它。 讓我們使用你的代碼,儘管。
要修改返回指針,需要更改存儲在保存的ebp下面的地址,所以 ebp + 0x4 。 因此,要從變數buffer1返回返回指針,我們必須添加 0xC ( 到 ebp ),然後再添加 0 ( 返回指針在 ebp 下為 0 x4 ) 。 現在我們可以進行修改。
我接受你的C 代碼,你希望跳過 x = 1的分配並直接返回到 printf 。 刪除 main 以查找返回指針的適當修改:(gdb) disassemble main
Dump of assembler code for function main:
0x080483e2 : push ebp
0x080483e3 : mov ebp,esp
0x080483e5 : and esp,0xfffffff0
0x080483e8 : sub esp,0x20
0x080483eb : mov DWORD PTR [esp+0x1c],0x0
0x080483f3 : mov DWORD PTR [esp+0x8],0x3
0x080483fb : mov DWORD PTR [esp+0x4],0x2
0x08048403 : mov DWORD PTR [esp],0x1
0x0804840a : call 0x80483c4
0x0804840f : mov DWORD PTR [esp+0x1c],0x1
0x08048417 : mov eax,DWORD PTR [esp+0x1c]
0x0804841b : mov DWORD PTR [esp+0x4],eax
0x0804841f : mov DWORD PTR [esp],0x80484f0
0x08048426 : call 0x80482f4
0x0804842b : leave
0x0804842c : ret
End of assembler dump.
如果不修改返回指針,則在 0 x0804840a處調用 function 將返回 0 x0804840f 。 但是我們想跳過這個,回到下一個指令。 下一條指令從 0個x08048417開始,它是along位的。 所以我們對返回指針的修改必須增加 0個x8的值。
考慮到這些因素,我使用下面的代碼來列印" 0"而不是" 1":void function(int a, int b, int c) {
char buffer1[8];
char buffer2[10];
int* ret;
ret = buffer1 + 0x10;
*ret+=8;
}
void main() {
int x;
x = 0;
function(1,2,3);
x = 1;
printf("%dn",x);
}
linux2.6 gcc,在Linux内核 2.6.38.7 上,gcc堆栈粉碎代码不工作 请帮助_gcc_开发99编程知识库...相关推荐
- linux proc io,在/proc/[pid]/io 中,理解计数器_linux-kernel_开发99编程知识库
虽然proc从 ( 所以大多数手册/文档都与 cookie-cutter user-space开发无关) 背后是可悲,这个东西完全是幸运的是记录在linux内核源代码Documentation/fil ...
- linux缓存限制,如何限制复制使用的缓存,以便仍有其他缓存可用的内存?_linux_开发99编程知识库...
Basic概況: 我是複製部分NTFS索盤openSuSE中. 每一顆恆星都2TB . 當我這樣做的時候,系統運行緩慢. 我的猜測: 我想這可能是由於緩存. linux決定放棄有用的緩存( 如: KD ...
- matlab识别不出linux链接,在Ubuntu上,从matlab调用外部脚本失败_linux_开发99编程知识库...
我搜索了很多次,但没有解决这个问题. 我使用系统( )/unix ( ) 从matlab调用外部 R 脚本,并找到共享库的mis加载. 我知道在matlab中环境是错误的. 我还尝试在xterm或者g ...
- linux 协议错误,在linux客户机上:协议错误,Vagrant无法挂载同步的文件夹_vagrant_开发99编程知识库...
使用一個 Windows 主機和一個運行在in的Linux客戶機使用同步文件夾,我有一個奇怪的問題. 在第一個引導( 或者在 vagrant destroy 之後) 中,項目文件夾掛載到/vagran ...
- linux kernel 调度,在Linux中,实时调度_kernel_开发99编程知识库
在實時調度,fifo和RR不具有完全相同的含義他們在非實時調度. 但是,進程總是在FIFO方式中選擇的時間量程SCHED_FIFO不限制不同的時間量程SCHED_RR . schED_FIFO進程不能 ...
- linux下缓存命中测试,linux为什么报表缓存缓存未命中?_linux_开发99编程知识库...
在我的系統里 Intel Xeon X5570 @ 2.93 GHz 我能夠通過請求這些事件來獲得 perf stat 報告緩存引用和缺失perf stat -B -e cache-reference ...
- linux列出管道,lsof列出的管道列表示什么意思?_linux_开发99编程知识库
文件不僅以流形式打開. 其中一些是在 lsof 手冊中列出的:FD is the File Descriptor number of the file or: cwd current working ...
- linux 无法启动matlab,在具有 jre 1.7.0 _05的科学linux上,无法启动 MATLAB gui ( 指南)_matlab_开发99编程知识库...
问题:指南gui缺少它的常用功能( 放下,按下按钮等) . 它们只是显示为空 Windows,边框描绘了不同按钮以前的位置. 这个问题似乎与我正在使用的jre版本相关. 我不知道该怎么继续. 这里是 ...
- gcc与linux内核,linux内核版本及其编译的gcc版本
以前不知道,现在用crosstool-ng编译了5.2.0版本的arm-linu-gcc,再编译之前的linux-3.15.4发现会提示 include/linux/compiler-gcc.h:10 ...
最新文章
- JPA注解@GeneratedValue
- reverseinverse
- java web分层的思想
- 修改labelImg软件的yolo标注写入格式(.txt文件不换行的解决办法)(将换行符'\n'替换成'\r\n')
- Docker容器的重启策略
- ul下的img水平居中 图片等比例缩放
- python字符串format格式化二
- 超市商品管理系统C语言课程设计
- 论坛mysql表设计_网站论坛如何制作—简单论坛数据库的设计与操作
- 机器学习笔记——乳腺癌鸢尾花分类问题详解(没有直接调包)
- Eclipse中文版的,怎么变成英文版
- 安卓开发者必备的5款App:终端模拟器、颜色萃取、移动IDE等
- html5对锚的更改,HTML5之锚链接
- 高等数学极限运算法则
- Unity获取物体自身坐标轴的方向以及沿着该方向运动的方法
- mysql查询专业术语,英文术语MySQL查询
- 如何把录音转换成文字?这几个方法可以轻松解决录音转文字
- Python数据分析复习整理(numpy)
- 计算机组成原理——篇三
- 如何查询出一个字段不重复的记录?