Chinaunix首页 | 论坛 | 博客
  • 博客访问: 407311
  • 博文数量: 57
  • 博客积分: 193
  • 博客等级: 入伍新兵
  • 技术积分: 1192
  • 用 户 组: 普通用户
  • 注册时间: 2012-12-13 14:37
个人简介

当以艺术眼光看程序,寻找程序后面的原理,做到化而不忘

文章分类

全部博文(57)

文章存档

2017年(5)

2015年(7)

2014年(27)

2013年(18)

我的朋友

分类: Windows平台

2014-06-19 22:50:12

在写ShellCode时有个小技巧,Shellcode中经常要用到字符串,字符串存储在哪里呢?ShellCode要求代码短小,所以将字符串等数据信息和代码信息组织在一起,那是最好的选择。这里一个小技巧就是:将字符串信息存储在栈中,使用时直接传递ESP地址就可以了。具体解释如下:

68 6C6C0000 PUSH 6C6C ;\0\0ll

68 33322E64 PUSH 642E3233 ;d.23

68 75736572 PUSH 72657375 ;resu

54 PUSH ESP

Window下是小端格式,可以看出,上面通过Push指令将ASCII码压入栈中,在栈中构造一个字符串,这样在栈中就是参数和字符串混杂了,这样大大打破了一般的我们的认识中,栈中只有参数的惯例,很是另类。

其实仔细想想,SEH技术也是在参数中构造一堆的数据,并将这些数据串联起来,实现了神奇的效果。

从这个小技巧中,我们认识到,栈中可以存储任何数据,可以存储字符串,那当然也可以存储其它东西,比如一些函数的地址信息,比如LoadLibrary函数地址,在代码注入时可以考虑将其转化为参数,将函数的地址信息通过参数间接存储在栈中。

栈真是个神奇的地方。

阅读(2625) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~