有人能给我解释一下这些函数到底是做什么的吗?我有一个断点设置为at<+35>,如箭头所示,这就是我迷路的地方。到目前为止,我只知道这个阶段接受一个长度为6的字符串,但是我并不确切地知道movsbl和movzbl函数中发生了什么。我并不期待答案,但如果能有一些见解,我将不胜感激。
如果这个问题以前被回答过,请不要批评我,或者将我重定向到另一个类似的问题。我已经看过所有这些了,但我仍然不明白这是怎么回事。
Dump of assembler code for function phase_5:
0x08048edc <+0>: push %ebp
0x08048edd <+1>: mov %esp,%ebp
0x08048edf <+3>: push %edi
0x08048ee0 <+4>: push %esi
0x08048ee1 <+5>: push %ebx
0x08048ee2 <+6>: sub $0x2c,%esp
0x08048ee5 <+9>: mov 0x8(%ebp),%eax
0x08048ee8 <+12>: mov %eax,(%esp)
0x08048eeb <+15>: call 0x80490a0 <string_length>
0x08048ef0 <+20>: cmp $0x6,%eax
0x08048ef3 <+23>: je 0x8048efa <phase_5+30>
0x08048ef5 <+25>: call 0x8049341 <explode_bomb>
0x08048efa <+30>: mov $0x0,%eax
=> 0x08048eff <+35>: lea -0x1f(%ebp),%ecx
0x08048f02 <+38>: mov $0x804a4e0,%edx
0x08048f07 <+43>: mov 0x8(%ebp),%ebx
0x08048f0a <+46>: movsbl (%ebx,%eax,1),%esi
0x08048f0e <+50>: and $0xf,%esi
0x08048f11 <+53>: movzbl (%edx,%esi,1),%esi
0x08048f15 <+57>: mov %esi,%ebx
0x08048f17 <+59>: mov %bl,(%ecx,%eax,1)
0x08048f1a <+62>: add $0x1,%eax
0x08048f1d <+65>: cmp $0x6,%eax
0x08048f20 <+68>: jne 0x8048f07 <phase_5+43>
0x08048f22 <+70>: movb $0x0,-0x19(%ebp)
0x08048f26 <+74>: movl $0x804a4b7,0x4(%esp)
0x08048f2e <+82>: lea -0x1f(%ebp),%eax
0x08048f31 <+85>: mov %eax,(%esp)
0x08048f34 <+88>: call 0x80490bb <strings_not_equal>
0x08048f39 <+93>: test %eax,%eax
0x08048f3b <+95>: je 0x8048f42 <phase_5+102>
0x08048f3d <+97>: call 0x8049341 <explode_bomb>
0x08048f42 <+102>: add $0x2c,%esp
0x08048f45 <+105>: pop %ebx
0x08048f46 <+106>: pop %esi
0x08048f47 <+107>: pop %edi
0x08048f48 <+108>: pop %ebp
0x08048f49 <+109>: ret
End of assembler dump.发布于 2014-02-28 05:27:48
这是函数的反编译。
/**
* + 8: arg0
* + 4: Return Address
* EBP 0: Old EBP
* - 4: Saved EDI
* - 8: Saved ESI
* -12: Saved EBX
*
* -25: NUL character
* -31: Beginning of 6-char string
*
* ESP+4 = -52: argument 1 for callees
* ESP+0 = -56: argument 0 for callees
*/
u8 GBL0[16] = {,,,,,,,,,,,,,,,};/* ADDRESS 0x804a4e0 */
u8 GBL1[] = {,,,,,,'\0'}; /* ADDRESS 0x804a4b7 */
phase_5(i8* arg0){
i8 PAD0[12];/* ADDRESS EBP-0x18 */
u8 LOC0[7]; /* ADDRESS EBP-0x1f */
i8 PAD1[25];/* ADDRESS EBP-0x38 = ESP+0 */
/* The range [EBP-56, EBP-48) corresponds to
the range [ESP+0, ESP+8) and is used to
place arguments for function calls. */
register int eax;/* In EAX */
if(string_length(arg0) != 6){
explode_bomb();
}
for(eax=0;eax<6;eax++){
LOC0[eax] = GBL0[arg0[eax] & 0xF];
}
LOC0[6] = '\0';/* ADDRESS EBP-0x19 */
if(eax = strings_not_equal(LOC0, GBL1)){
explode_bomb();
}
return eax;/* Maybe? */
}从本质上讲,当且仅当参数是6个字符的“字符串”,并且成功地将其替换为等于某个密码的6个字符的字符串时,它才不会爆炸炸弹。
发布于 2018-10-04 06:12:41
movzbw:字节(8位)到字(16位)
movzwl:字(16位)到长(32位)
movzbl:字节(8位)到长(32位)
https://stackoverflow.com/questions/22032475
复制相似问题