linux - 汇编代码到 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
这避免了使用多个部分,但遗憾的是会导致分段错误。
解决方案
推荐阅读
- javascript - JavaScript 检查对象是否存在于数组中
- spring - 如何解决没有密码且只有魔术链接的身份验证?
- python - 如何从python中的for循环创建和返回字典?
- c# - OnTriggerEnter2D 太慢
- c++ - 有没有办法在 C++ 中更新对向量中的一对
- reactjs - 我可以从另一个组件更改一个组件状态吗?
- ssis - SSIS 发送邮件任务 - 超链接重命名
- r - 如何从R中的数据框的列中给出数组元素名称
- r - 错误:Quosures 只能在 quasiquotation 上下文中不被引用,功能与 plotly
- rest - 关于改善内存和性能方面的文件上传 - struts 1