Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SHILCODE调用不同的SysCurl,而单独运行作为独立代码,而运行C++代码_C++_Linux_Assembly_Nasm_System Calls - Fatal编程技术网

SHILCODE调用不同的SysCurl,而单独运行作为独立代码,而运行C++代码

SHILCODE调用不同的SysCurl,而单独运行作为独立代码,而运行C++代码,c++,linux,assembly,nasm,system-calls,C++,Linux,Assembly,Nasm,System Calls,我有这样一个代码运行的shell: BITS 64 global _start _start: mov rax, 59 jmp short file c1: pop rdi jmp short argv c2: pop rsi mov rdx, 0 syscall file: call c1 db '/bin/sh',0 argv: call c2 dq arg, 0 arg: db 'sh',0 以这种方式构建时

我有这样一个代码运行的shell:

BITS 64

global _start
_start:

  mov rax, 59

  jmp short file
  c1:
  pop rdi

  jmp short argv
  c2:
  pop rsi

  mov rdx, 0

  syscall

file:

  call c1
  db '/bin/sh',0

argv:

  call c2
  dq arg, 0

arg:

  db 'sh',0
以这种方式构建时,它可以工作:

nasm -f elf64 shcode.asm
ld shcode.o -o shcode
尽管如此,当我将其转换为二进制形式时:

nasm -f bin shcode.asm
粘贴到下面的C++代码:

int main(void)
{

  char kod[]="\xB8\x3B\x00\x00\x00\xEB\x0B\x5F\xEB\x15\x5E\xBA\x00\x00\x00\x00\x0F\x05\xE8\xF0\xFF\xFF\xFF\x2F\x62\x69\x6E\x2F\x73\x68\x00\xE8\xE6\xFF\xFF\xFF\x34\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x73\x68\x00";
  reinterpret_cast<void(*)()>(kod)();

  return 0;

}
我看到类似的情况我用^C停止了这个过程:

syscall_0xffffffffffffffda(0x7ffc23e0a297, 0x7ffc23e0a2a4, 0, 0x4a0, 0x7fe1ff3039b0, 0x7fe1ff69b960) = -1 ENOSYS (Nie zaimplementowana funkcja)
syscall_0xffffffffffffffda(0x7ffc23e0a297, 0x7ffc23e0a2a4, 0, 0x4a0, 0x7fe1ff3039b0, 0x7fe1ff69b960) = -1 ENOSYS (Nie zaimplementowana funkcja)
.
.
.
syscall_0xffffffffffffffda(0x7ffc23e0a297, 0x7ffc23e0a2a4, 0, 0x4a0, 0x7fe1ff3039b0, 0x7fe1ff69b960) = -1 ENOSYS (Nie zaimplementowana funkcja)
^Csyscall_0xffffffffffffffda(0x7ffc23e0a297, 0x7ffc23e0a2a4, 0, 0x4a0,  0x7fe1ff3039b0, 0x7fe1ff69b960strace: Process 2806 detached
 <detached ...>
Nie zaimplementowana funkcja-未实现函数


<程序> Aka SealCd码是运行不正确的SysCurror的。

< P>在C++ C++代码调用中,Strues显示你的执行系统调用是< /P>
execve("/bin/sh", [0x34], NULL)         = -1 EFAULT (Bad address)
后面的系统调用\u 0xFFFFFFFFFFFFDA…=-1 ENOSYS来自一个无限循环,RAX=-EFAULT而不是59,然后来自RAX=-ENOSYS再次不是一个有效的呼叫号码。此循环由您的呼叫/弹出创建

可能是因为您已从未链接的.o或PIE可执行文件中转储了arg的绝对地址,这就是您获得0x34作为绝对地址的原因

显然,如果绝对地址是从随机堆栈地址运行的,并且没有重新定位修正,那么在外壳代码中嵌入绝对地址的整个方法都是行不通的。dq arg,0不是位置独立的

您至少需要自己构造argv数组,通常使用push指针。您还可以使用push imm32来构造arg本身。e、 g.按“shsh”键/lea-rax键[rsp+2]

或者,最常见的技巧是利用Linux特有的特性:您可以通过xor esi、esi传递argv=NULL,而不是指向NULL指针的指针


使用mov reg,0完全违背了jmp/call/pop技巧避免零字节的目的。如果允许零字节,您还可以使用普通的RIP相对LEA。但如果不是,你可以跳过数据,然后使用RIP相对LEA负位移。

< P>在你的C++ SLELCODER调用方中,Strues显示你的执行系统调用是< /P>
execve("/bin/sh", [0x34], NULL)         = -1 EFAULT (Bad address)
后面的系统调用\u 0xFFFFFFFFFFFFDA…=-1 ENOSYS来自一个无限循环,RAX=-EFAULT而不是59,然后来自RAX=-ENOSYS再次不是一个有效的呼叫号码。此循环由您的呼叫/弹出创建

可能是因为您已从未链接的.o或PIE可执行文件中转储了arg的绝对地址,这就是您获得0x34作为绝对地址的原因

显然,如果绝对地址是从随机堆栈地址运行的,并且没有重新定位修正,那么在外壳代码中嵌入绝对地址的整个方法都是行不通的。dq arg,0不是位置独立的

您至少需要自己构造argv数组,通常使用push指针。您还可以使用push imm32来构造arg本身。e、 g.按“shsh”键/lea-rax键[rsp+2]

或者,最常见的技巧是利用Linux特有的特性:您可以通过xor esi、esi传递argv=NULL,而不是指向NULL指针的指针


使用mov reg,0完全违背了jmp/call/pop技巧避免零字节的目的。如果允许零字节,您还可以使用普通的RIP相对LEA。但如果没有,您可以跳过数据,然后使用带负位移的RIP相对LEA。

脱离主题:您不需要单独的jmp/call/pop序列:一旦有了一个序列,您就可以使用LEA rsi、[rdi+argv-file_data]来获取另一个具有4字节LEA的序列。在file:中的db和call上放置一个file_数据标签。off-topic:您不需要单独的jmp/call/pop序列:一旦有了一个jmp/call/pop序列,您就可以执行learsi,[rdi+argv-file_data]来获取另一个具有4字节lea的序列。在file:中的db和调用中放置一个file_数据标签。当我使用xor rsi、rsi运行它时,第一个代码仍然有效,而不是将argv移动到rsi中。第二个代码现在不显示任何内容并退出,但shell仍然没有运行。@RomanKwaśniewski:所以用GDB和strace调试它。你确定它没有运行外壳吗?无论哪种方式,您都会得到一个shell提示,因此除非您使用strace,否则工作和静默退出之间的区别并不明显。除非您添加了一个退出系统调用,否则我看不出这段代码如何返回。顺便说一句,xor esi,esi没有RSI;我的回答没有错。在写入32位寄存器时,不需要引入无用的REX前缀来使64位归零显式而不是隐式。如何实现这个push'shsh'/lea-rax,[rsp+2]技巧?我尝试在不同的变体中执行此操作,每次都收到非法指令内核转储或分段错误内核dumped@RomanKwaśniewski:您只需创建一个以零结尾的sh字符串,该字符串由RAX指向。然后你推一个调零寄存器,然后RAX在堆栈上创建argv[]和mov rsi,rsp。当我用xor rsi,rsi运行它时,第一个代码仍然有效,而不是将argv移到rsi中。第二个代码现在不显示任何内容并退出,但shell仍然没有运行。@RomanKwaśniewski:所以用GDB和strace调试它。你确定它没有运行外壳吗?无论哪种方式,您都会得到一个shell提示,因此除非您使用strace,否则工作和静默退出之间的区别并不明显。我不明白你怎么会这样
他的代码可能会返回,除非您添加退出系统调用。顺便说一句,xor esi,esi没有RSI;我的回答没有错。在写入32位寄存器时,不需要引入无用的REX前缀来使64位归零显式而不是隐式。如何实现这个push'shsh'/lea-rax,[rsp+2]技巧?我尝试在不同的变体中执行此操作,每次都收到非法指令内核转储或分段错误内核dumped@RomanKwaśniewski:您只需创建一个以零结尾的sh字符串,该字符串由RAX指向。然后按下一个调零寄存器,然后按RAX在堆栈上创建argv[],以及mov rsi,rsp。