- 論壇徽章:
- 0
|
以下程序
- int main()
- {
- __asm__ __volatile__
- ("
- mov $0x0, %edx ;\
- push %edx ;\
- push $0x68732f6e ;\
- push $0x69622f2f ;\
- mov %esp, %ebx ;\
- push %ebx ;\
- mov %esp, %ecx ;\
- mov $0xb, %eax ;\
- int $0x80
- ");
- }
復(fù)制代碼
在int0x80前斷點,得到
- (gdb) display/i $eip
- 1: x/i $eip 0x804831e <main+42>: int $0x80
- (gdb) info reg eax ebx ecx edx
- eax 0xb 11
- ebx 0xbffff9c4 -1073743420
- ecx 0xbffff9c0 -1073743424
- edx 0x0 0
- (gdb) x/s $ebx
- 0xbffff9c4: "//bin/sh"
- (gdb) x/s *0xbffff9c0
- 0xbffff9c4: "//bin/sh"
復(fù)制代碼
execve聲明 int execve(const char *filename, char *const argv [], char *const envp[]);
eax 系統(tǒng)調(diào)用號:11
ebx filename: //bin/sh
ecx *argv[] : 只向0xbffff9c4(//bin/sh字符串的指針)
edx *envp[]: 0 沒有環(huán)境變量
看上去都沒有錯,但是運行都沒能啟動shell
后來查書,發(fā)現(xiàn)
- int main()
- {
- __asm__ __volatile__
- ("
- mov $0x0, %edx ;\
- push %edx ;\
- push $0x68732f6e ;\
- push $0x69622f2f ;\
- mov %esp, %ebx ;\
- push %edx ;\
- push %ebx ;\
- mov %esp, %ecx ;\
- mov $0xb, %eax ;\
- int $0x80
- ");
- }
復(fù)制代碼
竟然可以。
求教,為什么要把edx壓棧。 根據(jù)/usr/include/asm/unistd.h 里面 _syscall3 的宏, 不是只把參數(shù)依次放進(jìn)ebx, ecx, edx 就可以了?為什么棧會有影響
已解決。 只是因為argv數(shù)組也需要null結(jié)尾。 真是低級問題。 
[ 本帖最后由 viton_xuan 于 2007-1-24 13:48 編輯 ] |
|