免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123下一页
最近访问板块 发新帖
查看: 4350 | 回复: 20
打印 上一主题 下一主题

这个helloworld看不懂。 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-03-20 15:17 |只看该作者 |倒序浏览


太长没试过。代码看不懂

论坛徽章:
0
2 [报告]
发表于 2011-03-20 16:43 |只看该作者
图挂了

论坛徽章:
0
3 [报告]
发表于 2011-03-20 16:57 |只看该作者
2[f]的位置是main函数ret后执行的, 估计a里面放的就是write(1,  "hello world!", 0xe)

论坛徽章:
0
4 [报告]
发表于 2011-03-20 20:57 |只看该作者
又是 晓卫 这家伙的代码 。。。

论坛徽章:
1
射手座
日期:2013-08-21 13:11:46
5 [报告]
发表于 2011-03-20 23:13 |只看该作者
难道又是什么黑帽大赛之类的代码?

论坛徽章:
5
技术图书徽章
日期:2013-11-07 13:21:58技术图书徽章
日期:2013-12-07 10:34:46技术图书徽章
日期:2014-04-23 08:50:31双鱼座
日期:2014-09-16 09:12:34亥猪
日期:2015-01-23 13:37:49
6 [报告]
发表于 2011-03-20 23:14 |只看该作者
数组的名字和下标是可交换的。

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:56:11
7 [报告]
发表于 2011-03-21 00:39 |只看该作者
图挂了

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
8 [报告]
发表于 2011-03-21 02:08 |只看该作者
本帖最后由 OwnWaterloo 于 2011-03-21 20:09 编辑

  1. unsigned char a[] =
  2.       "\xeb\x17"              /* a+ 0: jmp <a+25>     */
  3.       "\x5e"                  /* a+ 2: pop %esi       */
  4.       "\x31\xc0"              /* a+ 3: xor %eax,%eax  */
  5.       "\x31\xdb"              /* a+ 5: xor %ebx,%ebx  */
  6.       "\x31\xd2"              /* a+ 7: xor %edx,%edx  */
  7.       "\xb0\x04"              /* a+ 9: mov $0x4,%al   */
  8.       "\xb3\x01"              /* a+11: mov $0x1,%bl   */
  9.       "\x8d\x0e"              /* a+13: lea (%esi),%ecx*/
  10.       "\xb2\x0d"              /* a+15: mov $0xd,%dl   */
  11.       "\xcd\x80"              /* a+17: int $0x80      */
  12.       "\x31\xdb"              /* a+19: xor %ebx,%ebx  */
  13.       "\xb0\x01"              /* a+21: mov $0x1,%al   */
  14.       "\xcd\x80"              /* a+23: int $0x80      */
  15.       "\xe8\xe4\xff\xff\xff"  /* a+25: call <a+2>     */
  16.       /* "Hello world!\n" */
  17.       "\x48\x65\x6c\x6c\x6f\x20\x77\x6f\x72\x6c\x64\x21\x0a"
  18. ;
  19. int main(int argc, char* argv[])
  20. {
  21.       (&argv)[-2] = (char**)a;
  22.       return 0;
  23. }
复制代码
a 中的代码
============

* a+0  jmp 到最末处 <a+25>
* a+25 call 会将该指令紧跟的地址 —— 返回地址 —— 入栈 , 并跳转到 a+2
* a+2  取出返回地址到 esi , 实际用作 "Hello world!\n" 文本的地址
* a+3, a+5, a+7 将 eax, ebx, edx 清0

* a+9  function=sys_write
* a+11 file_descriptor=1
* a+13 buffer=esi="Hello ..."
* a+15 size=0xd
* a+17 调用, 输出 Hello ...

* a+19 exit_status=0
* a+21 function=sys_exit
* a+23 调用, 退出程序

跳转到 a 中的代码
========================

方法是替换 main 函数的返回地址。

原始代码通过越界写入栈上数组。
我以前在论坛就说过, 这样会依赖编译器对栈变量的安排, 一试果然不行。

改为通过函数参数地址获得函数返回地址并修改。
依赖的是x86的调用约定, 比栈变量的布局要稳定得多。

buffer size
============

实际只有 13 字节, sys_write传递的是 14=0xe 。
而且 a[ 43 ] 恰好越界。

改为 a[ ] 与 13=0xd


UPDATE:

发帖的时候就有种缺了点什么的感觉……
果然, 忘记DEP了……
如何解决可搜我以前发的帖子……

论坛徽章:
22
丑牛
日期:2014-08-15 14:32:0015-16赛季CBA联赛之同曦
日期:2017-12-14 15:28:14黑曼巴
日期:2017-08-10 08:14:342017金鸡报晓
日期:2017-02-08 10:39:42黑曼巴
日期:2016-11-15 15:48:38CU十四周年纪念徽章
日期:2016-11-09 13:19:1015-16赛季CBA联赛之同曦
日期:2016-04-08 18:00:03平安夜徽章
日期:2015-12-26 00:06:30程序设计版块每日发帖之星
日期:2015-12-03 06:20:002015七夕节徽章
日期:2015-08-21 11:06:17IT运维版块每日发帖之星
日期:2015-08-09 06:20:002015亚冠之吉达阿赫利
日期:2015-07-03 08:39:42
9 [报告]
发表于 2011-03-21 08:06 |只看该作者
真厉害

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
10 [报告]
发表于 2011-03-21 10:20 |只看该作者

汇编的玩意没学好 …… 看着都头疼 ……
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP