硬编码地址组装
问题描述:
这里后改变是一个汇编代码片段:硬编码地址组装
jmp short getadd
shellcode:
pop esi
xor eax, eax
mov byte [esi+9], al
push dword esi
call 0x8048300
; adress found by deassmembling a c program for printf
xor eax,eax
mov al,0
xor ebx,ebx
int 0x80
getadd:
call shellcode
db "nice job!"
但后倾我找到的对象:
Disassembly of section .text:
00000000 <shellcode-0x2>:
0: eb 14 jmp 16 <getadd>
00000002 <shellcode>:
2: 5e pop %esi
3: 31 c0 xor %eax,%eax
5: 88 46 09 mov %al,0x9(%esi)
8: 56 push %esi
9: e8 fc 82 04 08 call 804830a <getadd+0x80482f4>
e: 31 c0 xor %eax,%eax
10: b0 00 mov $0x0,%al
12: 31 db xor %ebx,%ebx
14: cd 80 int $0x80
00000016 <mycall>:
16: e8 e7 ff ff ff call 2 <shellcode>
1b: 6e outsb %ds:(%esi),(%dx)
1c: 69 63 65 20 6a 6f 62 imul $0x626f6a20,0x65(%ebx),%esp
23: 21 .byte 0x21
为什么地址从改变0x8048300到804830a?
答
英特尔指令集参考文件的破解时间!
E8
是CALL rel32
:
呼叫附近,相对的,相对于下一条指令位移。
这意味着你不调用绝对地址0x8048300
,而你在一些排量从你身在何处,现在打电话来的地址(实际上是从下一条指令)。
如果你想调用一个绝对地址,你需要使用FF
Call r/m32
(调用寄存器或内存地址)的形式。
mov eax, 0x8048300
call eax
您可以享受,这是非常愉快的有[objdump的输出Intel语法(http://*.com/questions/10362630/how-can-objdump-emit-intel-syntax)。 –
真的,谢谢先生Jonathon – silentboy
另外,为什么你在运行时null结束字符串?只要做'db'很好的工作!“,0' –