能力值:
( LV2,RANK:10 )
|
-
-
26 楼
呵呵,吱一声,好玩哟
|
能力值:
( LV2,RANK:10 )
|
-
-
27 楼
是如何得到参数的地址的?
68 77 65 73 74 PUSH 74736577
68 66 61 69 6C PUSH 6C696166
这2个地址应该是"failwest"的地址吧?是如何得到这2个地址的呢?
还有cpu如何知道一个参数已经结束?接下来的是第2个参数呢?如果是在参数末尾加\0,那要怎么写汇编代码呢?希望大牛们写个代码让我看看,先行谢过了!期待...
|
能力值:
(RANK:330 )
|
-
-
28 楼
其实
push ebx // cut string
push 0x74736577
push 0x6C696166//push failwest
并不是压得参数本身,只是把failwest存入内存,这里为了简单,就直接存到栈里了,当然存任何地方都可以
首先记得ESP永远指向栈顶,那么:
PUSH ebx
这句就是在栈里放个0,因为EBX已经在前一句清0了,这时ESP指向这个0
top
0 《---esp
bottom
push 0x74736577
向栈中压入“west”。这时ESP指向“west”,当然后面跟着先前的0,刚好构成字符串
top
west 《----esp
0
bottom
push 0x6C696166
向栈中压入“fail”。这是ESP指向“fail”,当然后面跟着先前的west和0
top
fail 《---esp
west
0
bottom
所以这时的ESP值相当于指向字符串failwest的指针,把它保存在EAX里边
are we clear now?
我们最终的参数只是调用前的四次压栈,两次EBX(0),两次EAX(字符串指针)
至于函数怎么用这些参数,请你回去精读第3讲中的内容,或者自己写点传参数的例子,亲自动手跟几遍就彻底明白了——这是搞清问题的最有效办法
|
能力值:
( LV12,RANK:240 )
|
-
-
29 楼
看了楼上的帖子 想到一个成语 循循善诱~
|
能力值:
( LV2,RANK:10 )
|
-
-
30 楼
多谢老大,弄清楚68 77 65 73 74 PUSH 74736577 68 66 61 69 6C PUSH 6C696166
了,先前一直以为是字符串的地址,原来就是字符串!
再次感谢!`
|
能力值:
( LV2,RANK:10 )
|
-
-
31 楼
看完这个 心里就2个字.......阴险......ESP指向溢出覆盖地址的后面 原来是利用堆栈平衡...
|
能力值:
( LV2,RANK:10 )
|
-
-
32 楼
老师下一讲什么时候呢?期待哈~早点端凳子等着
|
能力值:
( LV2,RANK:10 )
|
-
-
33 楼
吱——吱——吱
|
能力值:
( LV2,RANK:10 )
|
-
-
34 楼
继续学习中,楼主辛苦
|
能力值:
( LV2,RANK:10 )
|
-
-
35 楼
不错,呵呵,我喜欢,呵呵
|
能力值:
( LV2,RANK:10 )
|
-
-
36 楼
出的好慢呀,7什么时候出呀!!等不急了,最好快点出书吧
|
能力值:
( LV12,RANK:2670 )
|
-
-
37 楼
讲的非常精彩,赞一个
|
能力值:
( LV6,RANK:90 )
|
-
-
38 楼
哇哈哈哈 先顶后看
|
能力值:
( LV2,RANK:10 )
|
-
-
39 楼
吱——吱——吱
|
能力值:
( LV9,RANK:290 )
|
-
-
40 楼
吱——吱——吱
==============
提问:"万年不变的jmp esp"可否提供几个!
|
能力值:
( LV2,RANK:10 )
|
-
-
41 楼
吱~~~~~~~~~~~~~~~~~~~~~~~~
|
能力值:
( LV2,RANK:10 )
|
-
-
42 楼
吱............................
看到用jmp esp的说明,有点不明白,可是老大后面的说明并没有用jump esp, 是笔误码吗?
|
能力值:
( LV4,RANK:50 )
|
-
-
43 楼
是啊!昨天晚上我看到一半就熄灯了,回去想了好久也想不出来!今天看了才知道原来是这样来"稳定"啊 呵呵
|
能力值:
( LV4,RANK:50 )
|
-
-
44 楼
不是!他是说用这jmp esp指令所在的地址啊
|
能力值:
( LV9,RANK:170 )
|
-
-
45 楼
菜鸟问题:
例子中的缓冲区是在子函数中,如果说子函数中没有缓冲区,而是由main函数获得读取字符串并传给子函数的一个字符串指针,里面只是调用了strcmp比较一下,这样的方式有没有什么好的解决办法?
|
能力值:
( LV2,RANK:10 )
|
-
-
46 楼
学习一下,还好能看明白.
|
能力值:
( LV2,RANK:10 )
|
-
-
47 楼
学习
吱--------吱--------吱
|
能力值:
( LV2,RANK:10 )
|
-
-
48 楼
我想了好久才做出来了一个 是简单的返回一个cmd窗口
JMP ESP 是在ntdll里面找到的
7C961EED FFE4 JMP ESP
我在本机测试没有问题 (你们看看有没有出错 不返回cmd窗口)
-----------------------------------------------------------
测试代码:
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
int fun(char *path);
int main(int argc, char *argv[])
{
fun("1.txt");
system("PAUSE");
return 0;
}
int fun(char *path)
{
char buf[10];
FILE *fp = fopen("1.txt","r+");
fscanf(fp,"%s",buf);
fclose(fp);
puts(buf);
return 1;
}
--------------------------------------------------
1.txt 文件内容 16进制编辑器复制出来的
Offset 0 1 2 3 4 5 6 7 8 9 A B C D E F
00000000 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 aaaaaaaaaaaaaaaa
00000010 61 61 61 61 61 61 61 61 61 61 61 61 ED 1E 96 7C aaaaaaaaaaaa?東
00000020 55 89 E5 6A 00 68 65 78 65 00 68 63 6D 64 2E 54 U夊j.hexe.hcmd.T
00000030 B8 90 18 40 00 FF D0 5D 笎.@.衇
|
能力值:
( LV2,RANK:10 )
|
-
-
49 楼
学习了,,,
|
能力值:
( LV5,RANK:60 )
|
-
-
50 楼
恩,确实不错
但是我感觉还是没能及时的消化完
是不是这篇文章与第五篇的区别就在于,不用查找缓冲区的地址了???
但是其他的模块函数的地址仍然要手动查找?
|
|
|