首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Shellcode C程序管理

Shellcode C程序管理
EN

Stack Overflow用户
提问于 2014-04-17 05:54:26
回答 1查看 895关注 0票数 1

很难让一个基本的外壳代码工具/测试C程序工作。当我单独运行它(nasm和ld)时,汇编程序(如下所示)似乎工作得很好--因为它打开一个名为key的文件,一次读取一个字节,并将其显示出来。

我已经获取了这个asm文件,并将十六进制编码提取为硬代码,在我的C管理程序中将其提取为一个名为char[] []的assn1,并使用函数指针来执行代码,但最终导致了分段错误。为了确保我没有疯,我添加了另一个名为char[]的shellcode[],它包含弹出式shell (aleph1)的十六进制,这似乎工作得很好。在运行我的C可执行文件之前,我正在调用execstack -s。

任何帮助都将不胜感激!我在这上面转了好几个小时.

Assn1.asm

代码语言:javascript
复制
jmp short bottom    ; relative addressing start

top:    
; setup params for open()
pop ebx         ; param1 ebx now holds 'key' 
xor ecx, ecx        ; param2 ecx corresponds to flag O_RDONLY
            ; param3 edx not required for existing file
xor eax, eax        ; clear eax to 0
mov al, 5       ; syscall open()
int 0x80        ; software interrupt to call open()
            ; returns int filedescriptor in eax

; setup params for read() and write()
mov ebx, eax        ; param1 ebx now holds filedescriptor   
sub esp, 1      ; allocate buffer of 1 bytes on stack
mov ecx, esp        ; param2 ecx now points to buffer
xor edx, edx        ; clear edx
inc edx         ; param3 edx set to 1 byte to be read   
rwloop:
xor eax, eax        ; clear eax
mov al, 3       ; syscall code for read()
int 0x80        ; read() 1 byte into buffer
test eax,eax        ; if eax=0, read() reached EoF
jz end          ; and stop reading/writing

; else get ready to write
push ebx        ; store filedescriptor for KEY onto stack 
xor ebx, ebx        ; clear ebx
inc ebx         ; param1 ebx = 1 for stdout
            ; param2 and param3 same from read()
xor eax, eax        ; clear eax
mov al, 4       ; syscall for write()
int 0x80
pop ebx         ; restore filedescriptor to ebx
jmp rwloop      

end:
; place esp back to original point on stack
; add esp, 1

; exit cleanly
xor ebx,ebx     ; retcode = 1
xor eax,eax     ; eax = 0
inc eax         ; eax = 1, syscall exit(1)
int 0x80

bottom:
call top        ; address of key pushed on stack
db 'key', 0

assn1_harness.c

代码语言:javascript
复制
#include <sys/mman.h>
#include <stdio.h>
#include <stdlib.h>


// The trailing null byte is implied because this is a string
char shellcode[] = {
"\xeb\x16\x5e\x31\xd2\x52\x56\x89\xe1\x89\xf3\x31\xc0\xb0\x0b\xcd"
"\x80\x31\xdb\x31\xc0\x40\xcd\x80\xe8\xe5\xff\xff\xff\x2f\x62\x69"
"\x6e\x2f\x73\x68"
};

char assn1[] = {
  "\xeb\x43\x66\x5b\x66\x31\xc9\x66\x31\xc0\xb0\x05\xcd\x80\x66\x89"
  "\xc3\x66\x83\xec\x01\x66\x89\xe1\x66\x31\xd2\x66\x42\x66\x31\xc0"
  "\xb0\x03\xcd\x80\x66\x85\xc0\x74\x12\x66\x53\x66\x31\xdb\x66\x43"
  "\x66\x31\xc0\xb0\x04\xcd\x80\x66\x5b\xeb\xe2\x66\x31\xdb\x66\x31"
  "\xc0\x66\x40\xcd\x80\xe8\xba\xff\x6b\x65\x79"
};

int main (int argc, char **argv) {

int (*func)();

//func = (int (*)()) shellcode;
func = (int (*)()) assn1;

(*func)();  

return 0;
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-04-17 10:22:29

您的机器代码是错误的,它似乎被组装为16位代码。你忘了bits 32

这样做效果更好:

代码语言:javascript
复制
char assn1[] = {
    "\xeb\x31\x5b\x31\xc9\x31\xc0\xb0\x05\xcd\x80\x89\xc3\x83\xec\x01"
    "\x89\xe1\x31\xd2\x42\x31\xc0\xb0\x03\xcd\x80\x85\xc0\x74\x0d\x53"
    "\x31\xdb\x43\x31\xc0\xb0\x04\xcd\x80\x5b\xeb\xe9\x31\xdb\x31\xc0"
    "\x40\xcd\x80\xe8\xca\xff\xff\xff\x6b\x65\x79"
};

学习使用调试器。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23125592

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档