我正在尝试编写一个运行execve的shellcode。等效的c程序如下所示:
int main ()
{
char *argv[3] = {"/bin/sh","-i", "/dev/tty", NULL};
execve("/bin/sh", argv, NULL);
return 0;
}
c程序运行正常。然后我尝试编写我的测试程序(修改为推送null):
#include<stdio.h>
int main(){
__asm__(
"xor %rdx,%rdx\n\t" //rdx is the third argument for execve, null in this case.
"push %rdx\n\t"
"mov -8(%rbp),%rdx\n\t"
"mov $0x692d,%rdi\n\t" //$0x6924 is 'i-'
"push %rdi\n\t" //push '-i' to the stack
"lea -16(%rbp),%rax\n\t" //now rax points to '-i'
"mov $0x31b7f54a83,%rdi\n\t" //the address of /bin/sh
"push %rdi\n\t" //push it to the stack
"push %rdx\n\t" //end the array with null
"mov $0x31b7e43bb3,%rdi\n\t" //the address of "/bin/sh"
"push %rdi\n\t" //push the address of "/dev/tty to the stack
"push %rax\n\t" //push the address of '-i' to the stack
"mov $0x31b7f54a83,%rdi\n\t"
"push %rdi\n\t" //push the address of /bin/sh again to the stack
"mov %rsp,%rsi\n\t" //rsi now points to the beginning of the array
"mov -24(%rbp),%rdi\n\t" //rdi now points to the addresss of "/bin/sh"
"mov $0x3b,%rax\n\t" // syscall number = 59
"syscall\n\t"
);
}
我在这里有内存中字符串的地址,我们可以假设它们不会改变。但是我们没有字符串'-i'的地址。所以我在这里做的是将参数推送到堆栈中:
Low ------------------------------------------------------------------ High
|addressof"/bin/sh"(rsi points to here)|addressof"-i"|addressof"/dev/ssh"|addressof"/bin/sh"(rdi points to here)|-i|
它不起作用。程序编译好了但是当我运行程序时,什么也没发生。
我不熟悉程序集,我对传递参数的方式有些担忧,例如,编译器如何知道argv参数何时在内存中结束?
修改
感谢Niklas B的以下建议,我使用了trace来查看execve是否实际运行。我得到execve(0x31b7f54a83, [0x31b7f54a83, "-i", 0x31b7e43bb3, 0x31b7f54a83, 0x692d], [/* 0 vars */]) = -1 EFAULT (Bad address)
,这意味着第二个参数传递错误。我推入堆栈的所有东西都被认为是argv参数的一部分!
将空值推入堆栈后,strace会给出execve(0x31b7f54a83, [0x31b7f54a83, "-i", 0x31b7e43bb3], [/* 0 vars */]) = -1 EFAULT (Bad address)
。只有当地址是字符串时,这才非常接近正确的答案......
感谢Brian,我现在看到问题出在哪里。硬编码地址位于另一个程序的共享库中。因此,该程序在实际输入该程序之前不应运行。谢谢大家,我会尽快更新。如果问题解决了,我会将其标记为已解决。
答案 0 :(得分:3)
正如Kerrek SB和user9000在评论中指出的那样,argv
数组必须是以空字符结尾的字符串数组。
修复后,单独运行此程序仍然无效,因为字符"/bin/sh"
和"/dev/tty"
可能不存在于您刚编译的程序中的那个位置,但是而是存在于shell代码旨在定位的程序中的那个位置。你需要实际将它注入到该程序中,以便它在那里执行,那些字符串就在那些地址上。