時,我在c內聯程序集中出現了段錯誤當我使用jmp
時出現了段錯誤。當我調用jmp
在第一時間,我只是用jmp 0x30
,和我有段故障。
我用gdb的debuged我的節目,我看到jmp
被稱爲後,就跳轉到一個絕對地址。
(gdb) b main
Breakpoint 1 at 0x80483b7: file f.c, line 3.
(gdb) r
Starting program: /root/work/f
Breakpoint 1, main() at f.c:3
3 __asm__("jmp 0x30\n"
(gdb) n
0x00000030 in ??()
(gdb)
我認爲它可能是一個相對地址,too.So我修改了PARAM爲jmp
作爲call
從disassemble main
地址。 只是這樣的事情,
#include<stdio.h>
int main(){
__asm__("jmp 0x080483e6\n"
"popl %esi\n"
"movl %esi,0x8(%esi)\n"
"movb $0x0,0x7(%esi)\n"
"movl $0x0,0xc(%esi)\n"
"movl $0xb,%eax\n"
"movl %esi,%ebx\n"
"leal 0x8(%esi),%ecx\n"
"leal 0xc(%esi),%edx\n"
"int $0x80\n"
"movl $0x1, %eax\n"
"movl $0x0, %ebx\n"
"int $0x80\n"
"call 0x2a\n"
".string \"/bin/sh\"\n");
return 0;
}
,但我得到這個
Breakpoint 1, main() at f.c:3
3 __asm__("jmp 0x080483e6\n"
(gdb) n
Program received signal SIGSEGV, Segmentation fault.
0x0000002a in ??()
(gdb)
我發現這個相關的問題confusing with JMP instruction,我修改了我這樣的代碼。
#include<stdio.h>
int main(){
__asm__("jmp L\n"
"sub:\n"
"popl %esi\n"
"movl %esi,0x8(%esi)\n"
"movb $0x0,0x7(%esi)\n"
"movl $0x0,0xc(%esi)\n"
"movl $0xb,%eax\n"
"movl %esi,%ebx\n"
"leal 0x8(%esi),%ecx\n"
"leal 0xc(%esi),%edx\n"
"int $0x80\n"
"movl $0x1, %eax\n"
"movl $0x0, %ebx\n"
"int $0x80\n"
"jmp exit\n"
"L:\n"
"call sub\n"
".string \"/bin/sh\"\n"
"exit:\n");
return 0;
}
,但它不適合我,jmp
被稱爲後,指令地址是仍然jmp
(gdb) b main
Breakpoint 1 at 0x80483b7: file f.c, line 3.
(gdb) r
Starting program: /root/work/f
Breakpoint 1, main() at f.c:3
3 __asm__("jmp L\n"
(gdb) n
Program received signal SIGSEGV, Segmentation fault.
0x080483ba in main() at f.c:3
3 __asm__("jmp L\n"
(gdb) n
Program terminated with signal SIGSEGV, Segmentation fault.
The program no longer exists.
(gdb)
行了,我不知道哪裏是問題,我真的很感激你的幫助!
我不確定你要在這裏完成什麼。如果你的目標是學習c,這是一個不好的開始。如果目標是學習asm,這是關於最複雜的開始方式。也就是說,你正在修改(一個BUNCH)寄存器在asm中而不通知編譯器。當你的asm()退出時,這會造成一團糟。如果您必須這樣做,請考慮使用[extended asm](https://gcc.gnu.org/onlinedocs/gcc/Extended-Asm.html),它允許您打開註冊表。 –