│0x4000f7 <main+15> lea
-0x4(%rbp),%rax │
│0x4000fb <main+19> mov
$0x6001b8,%esi │
│0x400100 <main+24> mov
%rax,%rdi │
│0x400103 <main+27> callq 0x40010f
<swap> │
│0x400108 <main+32> mov
$0x0,%eax │
│0x40010d <main+37>
leaveq │
>│0x40010e <main+38> retq
我使用 gdb 追蹤這個程式, 你的程式在 retq 這一行發生錯誤,
應該是因為 c runtime library 沒有被正確設定, 導致回不去上一層,
所以無法正確回到 shell。
int main()
{
int a = 100;^M
swap(&a, &shared);^M
asm
(
"mov $1, %eax\n"
"int $0x80\n"
);
return 0;
}
加入上述的 exit system call 就沒有問題了。
不過由於沒有使用 c runtime, 你得評估可能會發生什麼問題。
是哪本書告知你這個技巧呢? 感覺沒有補充說明該有的概念。
補充一下:
上述只是其中一種錯誤, 可能還會有另外的錯誤造成 Segmentation fault,
請不要以為這樣改就會是正確的程式碼。
※ 引述《gn00618777 (非常念舊)》之銘言:
: 我在閱讀一本書,裡面給一個靜態連結的範例
: a.c:
: extern int shared;
: int main() {
: int a = 100;
: swap(&a, &shared);
: return 0;
: }
: b.c:
: int shared = 1;
: void swap(int *a, int *b){
: *a ^= *b ^= *a ^= *b;
: }
: 編譯指令:
: gcc -c a.c -fno-stack-protector
: gcc -c b.c -fno-stack-protector
: 連結指令:
: ld a.o b.o -e main -o ab
: 執行時:
: ./ab 出現 segmentation fault(core dump)
: 請問有人知道這甚麼狀況嗎? 謝謝
: 我GCC 版本 gcc (Ubuntu 9.3.0-17ubuntu1~20.04) 9.3.0
: ld 版本 GNU ld (GNU Binutils for Ubuntu) 2.34