若要禁用堆棧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编程知识库...相关推荐

  1. linux proc io,在/proc/[pid]/io 中,理解计数器_linux-kernel_开发99编程知识库

    虽然proc从 ( 所以大多数手册/文档都与 cookie-cutter user-space开发无关) 背后是可悲,这个东西完全是幸运的是记录在linux内核源代码Documentation/fil ...

  2. linux缓存限制,如何限制复制使用的缓存,以便仍有其他缓存可用的内存?_linux_开发99编程知识库...

    Basic概況: 我是複製部分NTFS索盤openSuSE中. 每一顆恆星都2TB . 當我這樣做的時候,系統運行緩慢. 我的猜測: 我想這可能是由於緩存. linux決定放棄有用的緩存( 如: KD ...

  3. matlab识别不出linux链接,在Ubuntu上,从matlab调用外部脚本失败_linux_开发99编程知识库...

    我搜索了很多次,但没有解决这个问题. 我使用系统( )/unix ( ) 从matlab调用外部 R 脚本,并找到共享库的mis加载. 我知道在matlab中环境是错误的. 我还尝试在xterm或者g ...

  4. linux 协议错误,在linux客户机上:协议错误,Vagrant无法挂载同步的文件夹_vagrant_开发99编程知识库...

    使用一個 Windows 主機和一個運行在in的Linux客戶機使用同步文件夾,我有一個奇怪的問題. 在第一個引導( 或者在 vagrant destroy 之後) 中,項目文件夾掛載到/vagran ...

  5. linux kernel 调度,在Linux中,实时调度_kernel_开发99编程知识库

    在實時調度,fifo和RR不具有完全相同的含義他們在非實時調度. 但是,進程總是在FIFO方式中選擇的時間量程SCHED_FIFO不限制不同的時間量程SCHED_RR . schED_FIFO進程不能 ...

  6. linux下缓存命中测试,linux为什么报表缓存缓存未命中?_linux_开发99编程知识库...

    在我的系統里 Intel Xeon X5570 @ 2.93 GHz 我能夠通過請求這些事件來獲得 perf stat 報告緩存引用和缺失perf stat -B -e cache-reference ...

  7. linux列出管道,lsof列出的管道列表示什么意思?_linux_开发99编程知识库

    文件不僅以流形式打開. 其中一些是在 lsof 手冊中列出的:FD is the File Descriptor number of the file or: cwd current working ...

  8. linux 无法启动matlab,在具有 jre 1.7.0 _05的科学linux上,无法启动 MATLAB gui ( 指南)_matlab_开发99编程知识库...

    问题:指南gui缺少它的常用功能( 放下,按下按钮等) . 它们只是显示为空 Windows,边框描绘了不同按钮以前的位置. 这个问题似乎与我正在使用的jre版本相关. 我不知道该怎么继续. 这里是 ...

  9. gcc与linux内核,linux内核版本及其编译的gcc版本

    以前不知道,现在用crosstool-ng编译了5.2.0版本的arm-linu-gcc,再编译之前的linux-3.15.4发现会提示 include/linux/compiler-gcc.h:10 ...

最新文章

  1. JPA注解@GeneratedValue
  2. reverseinverse
  3. java web分层的思想
  4. 修改labelImg软件的yolo标注写入格式(.txt文件不换行的解决办法)(将换行符'\n'替换成'\r\n')
  5. Docker容器的重启策略
  6. ul下的img水平居中 图片等比例缩放
  7. python字符串format格式化二
  8. 超市商品管理系统C语言课程设计
  9. 论坛mysql表设计_网站论坛如何制作—简单论坛数据库的设计与操作
  10. 机器学习笔记——乳腺癌鸢尾花分类问题详解(没有直接调包)
  11. Eclipse中文版的,怎么变成英文版
  12. 安卓开发者必备的5款App:终端模拟器、颜色萃取、移动IDE等
  13. html5对锚的更改,HTML5之锚链接
  14. 高等数学极限运算法则
  15. Unity获取物体自身坐标轴的方向以及沿着该方向运动的方法
  16. mysql查询专业术语,英文术语MySQL查询
  17. 如何把录音转换成文字?这几个方法可以轻松解决录音转文字
  18. Python数据分析复习整理(numpy)
  19. 计算机组成原理——篇三
  20. 如何查询出一个字段不重复的记录?

热门文章

  1. 多媒体技术基础及应用
  2. Windows平台下的多线程编程
  3. 教你一招看清编程语言的发展趋势及未来方向
  4. 程序员被公司辞退12天,前领导要求回公司讲清楚代码,你们知道什么结果吗?
  5. 重磅!尤雨溪公布 Vue 3.0 开发路线
  6. 互联网创业公司的传统思维
  7. win7系统稳定测试软件,win7系统电脑测试cpu性能的方法(图文)
  8. mysql根据已有表创建新表_SQL根据现有表新建一张表
  9. network3D: 交互式桑基图
  10. 别再吼孩子骂孩子了,他们的脑子真的会受伤变形