因此,我一直在学习一些基本的汇编代码,这些代码专门用于编写Shellcode,这一切都很好,但我正在阅读的所有书都过时了。到目前为止,汇编代码部分一直运行顺利,但是我遇到了一些打开新shell的代码问题。
BITS 32
jmp short two ; Jump down to the bottom for the call trick
one:
; int execve(const char *filename, char *const argv [], char *const
envp[])
pop ebx ; ebx has the addr of the string
xor eax, eax ; put 0 into eax
mov [ebx+7], al ; null terminate the /bin/sh string
mov [ebx+8], ebx ; put addr from ebx where the AAAA is
mov [ebx+12], eax ; put 32-bit null terminator where the BBBB is
lea ecx, [ebx+8] ; load the address of [ebx+8] into ecx for argv ptr
lea edx, [ebx+12] ; edx = ebx + 12, which is the envp ptr
mov al, 11 ; syscall #11
int 0x80 ; do it
two:
call one ; Use a call to get string address
db '/bin/sh' ; the XAAAABBBB bytes aren't needed
在运行了几次测试程序后,我已经设法解决了我认为的问题。第一次使用程序中的立即数[ebx+7]
(因此,从理论上讲,另外两个mov
命令)会导致分段错误。我只是不明白为什么。我正在尝试进行的系统调用(如果上下文中的注释不是很好)是execve
,它使用文件名,指向参数数组的指针和envp
变量。这段代码正在尝试做的事情是否可能了?如果没有,我如何获得相同的效果?
如果您想知道的话,这本书是《黑客:剥削的艺术,第二版》,它是2008年制作的,就像我说的那样,过时了。