首页 > 解决方案 > 汇编代码到 shell 代码:section .data 和 section .text 的顺序是什么?

问题描述

对于作业,我编写了以下shell_exec.asm应在 Linux 中执行 shell 的汇编代码:

section .data ; declare stuff
  arg0 db "/bin/sh",0 ; 1st arg
  align 4
  argv dd arg0, 0 ; 2nd arg
  envp dd 0 ; 3rd arg

section .text
global _start
_start:
  mov eax, 0x0b ; execve
  mov ebx, arg0 ; 1st arg
  mov ecx, argv ; 2nd arg
  mov edx, envp ; 3rd arg
  int 0x80 ; kernel

我用于nasm -f elf32 shell_exec.asm编译和ld -m elf_i386 -o shell_exec shell_exec.o链接。到目前为止一切正常,如果我./shell_exec按照我想要的方式运行 shell。

现在我想\12\34\ab\cd\ef...从这个程序中提取 shell 代码(如 )。我曾经objdump -D -z shell_exec显示代码的所有部分,包括section .data和全零。输出如下:

shell_exec:     file format elf32-i386


Disassembly of section .text:

08049000 <_start>:
 8049000:       b8 0b 00 00 00          mov    $0xb,%eax
 8049005:       bb 00 a0 04 08          mov    $0x804a000,%ebx
 804900a:       b9 08 a0 04 08          mov    $0x804a008,%ecx
 804900f:       ba 10 a0 04 08          mov    $0x804a010,%edx
 8049014:       cd 80                   int    $0x80

Disassembly of section .data:

0804a000 <arg0>:
 804a000:       2f                      das
 804a001:       62 69 6e                bound  %ebp,0x6e(%ecx)
 804a004:       2f                      das
 804a005:       73 68                   jae    804a06f <__bss_start+0x5b>
 804a007:       00                      add    %al,(%eax)

0804a008 <argv>:
 804a008:       00 a0 04 08 00 00       add    %ah,0x804(%eax)
 804a00e:       00 00                   add    %al,(%eax)

0804a010 <envp>:
 804a010:       00 00                   add    %al,(%eax)
 804a012:       00 00                   add    %al,(%eax)

如果我的汇编代码中只有一个section .text,我通常可以复制所有给定的值并将它们用作我的 shell 代码。但是,如果我有这两个部分,即.data和,顺序如何.text

编辑 1

所以,我的第二次尝试是像这样编写汇编代码:

section .text
global _start

_start:
mov ebp, esp

xor eax, eax
push eax ; -4
push "/sh " ; -8
push "/bin" ; -12

xor eax, eax
push eax
lea ebx, [ebp-12] 
push ebx ; 1st arg

mov ecx, esp ; 2nd arg
lea edx, [ebp-4] ; 3rd arg

mov eax, 0x0b ; execve
int 0x80 ; kernel

这避免了使用多个部分,但遗憾的是会导致分段错误。

标签: linuxassemblynasmshellcodeobjdump

解决方案


推荐阅读