- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试从 shellcode 中取出 128 位 key 。我已将 shellcode 编译为数组中的 C 代码,如下所示
#include <stdio.h>
#include <stdlib.h>
/*shellcode.c*/
char code[] = "\x31\xC0\x50\x68\x75\x70\x25\x75\x68\x23\x78\x27\x78\x68\x25\x74\x72\x20\x68\x79\x24\x73\x77\x68\x71\x72\x77\x76\x68\x20\x25\x22\x70\x68\x23\x78\x75\x27\x68\x75\x20\x23\x75\x68\x76\x72\x79\x79\x68\x20\x70\x72\x73\x68\x71\x71\x24\x25\x68\x79\x27\x76\x77\x68\x24\x77\x71\x72\x68\x27\x79\x70\x70\x68\x74\x24\x24\x75\x68\x79\x73\x23\x23\x68\x74\x22\x75\x79\x68\x23\x74\x70\x27\x68\x20\x74\x24\x79\x68\x74\x77\x24\x78\x68\x25\x27\x70\x75\x68\x74\x77\x74\x78\x68\x23\x23\x71\x76\x68\x77\x70\x73\x71\x68\x27\x20\x77\x24\x68\x22\x72\x78\x75\x68\x25\x72\x79\x77\x68\x23\x75\x79\x76\x68\x72\x71\x72\x24\x68\x71\x23\x23\x79\x68\x79\x23\x79\x70\x68\x20\x20\x76\x77\x54\x5E\x8B\xFE\x8B\xD7\xFC\xB9\x80\x00\x00\x00\xBB\x41\x00\x00\x00\x31\xC0\x50\xAC\x33\xC3\xAA\xE2\xFA\x54\x5E\xCC";
int main(int argc, char **argv)
{
int (*func)();
func = (int (*)()) code;
(int)(*func)();
}
当我在linux下使用GCC编译它时。使用GDB反汇编后,shellcode位于code数组中;
(gdb) disas &code
Dump of assembler code for function code:
0x0000000000600840 <+0>: xor %eax,%eax
0x0000000000600842 <+2>: push %rax
0x0000000000600843 <+3>: pushq $0x75257075
0x0000000000600848 <+8>: pushq $0x78277823
0x000000000060084d <+13>: pushq $0x20727425
0x0000000000600852 <+18>: pushq $0x77732479
0x0000000000600857 <+23>: pushq $0x76777271
0x000000000060085c <+28>: pushq $0x70222520
0x0000000000600861 <+33>: pushq $0x27757823
0x0000000000600866 <+38>: pushq $0x75232075
0x000000000060086b <+43>: pushq $0x79797276
0x0000000000600870 <+48>: pushq $0x73727020
0x0000000000600875 <+53>: pushq $0x25247171
0x000000000060087a <+58>: pushq $0x77762779
0x000000000060087f <+63>: pushq $0x72717724
0x0000000000600884 <+68>: pushq $0x70707927
0x0000000000600889 <+73>: pushq $0x75242474
0x000000000060088e <+78>: pushq $0x23237379
0x0000000000600893 <+83>: pushq $0x79752274
0x0000000000600898 <+88>: pushq $0x27707423
0x000000000060089d <+93>: pushq $0x79247420
0x00000000006008a2 <+98>: pushq $0x78247774
0x00000000006008a7 <+103>: pushq $0x75702725
0x00000000006008ac <+108>: pushq $0x78747774
0x00000000006008b1 <+113>: pushq $0x76712323
0x00000000006008b6 <+118>: pushq $0x71737077
0x00000000006008bb <+123>: pushq $0x24772027
0x00000000006008c0 <+128>: pushq $0x75787222
0x00000000006008c5 <+133>: pushq $0x77797225
0x00000000006008ca <+138>: pushq $0x76797523
0x00000000006008cf <+143>: pushq $0x24727172
0x00000000006008d4 <+148>: pushq $0x79232371
0x00000000006008d9 <+153>: pushq $0x70792379
0x00000000006008de <+158>: pushq $0x77762020
0x00000000006008e3 <+163>: push %rsp
0x00000000006008e4 <+164>: pop %rsi
0x00000000006008e5 <+165>: mov %esi,%edi
0x00000000006008e7 <+167>: mov %edi,%edx
0x00000000006008e9 <+169>: cld
0x00000000006008ea <+170>: mov $0x80,%ecx
0x00000000006008ef <+175>: mov $0x41,%ebx
0x00000000006008f4 <+180>: xor %eax,%eax
0x00000000006008f6 <+182>: push %rax
0x00000000006008f7 <+183>: lods %ds:(%rsi),%al
0x00000000006008f8 <+184>: xor %ebx,%eax
0x00000000006008fa <+186>: stos %al,%es:(%rdi)
0x00000000006008fb <+187>: loop 0x6008f7 <code+183>
0x00000000006008fd <+189>: push %rsp
0x00000000006008fe <+190>: pop %rsi
0x00000000006008ff <+191>: int3
0x0000000000600900 <+192>: add %al,(%rax)
End of assembler dump.
看看反汇编,128位 key 将在6008fb处的循环指令之后计算。我对 GDB 不太满意。我如何从这个 shellcode 中获取 128 位 key ,我怀疑我需要在循环和查看内容之后放置一个指向右侧的指针?但我不知道该怎么做。 预先非常感谢您...
最佳答案
如果您可以成功运行此代码,它将停在最后的 int3
指令处。此时,内存中的解密字符串将从 rsp+8
开始(与 rsi+8
相同)。例如,您可以通过 x/s $rsp+8
从 gdb
打印它。 +8
来自 0x6008f6
处的 push %rax
。
请注意,此代码似乎是错误移植的 32 位代码。所有pushq
指令都将存储指令中给定的立即常量,后跟 4 个零字节。解密后,每 4 个字母都会以 AAAA
形式出现(并且只获得 key 的一半)。 0x6008e5
处的 mov %esi,%edi
会将 rdi
的最高位清零,因此只有当堆栈位于第一个堆栈时,代码才会工作4GB 地址空间(64 位系统上通常没有该空间)。
此外,代码假定它位于堆栈上,但您的 C 包装器将其放在数据部分中。无论如何,您也需要执行权限。
或者,由于此代码除了通过 0x41
对值进行异或运算之外什么也不做,因此您可以轻松地手动执行此操作,记住 x86 是小端字节序,因此反汇编中打印的常量必须是字节-交换。
关于c - 从 shellcode 中获取 128 位 key ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14333256/
我目前正在编写一个 shellcode,该代码利用使用 puts 函数的目标程序。该程序如下所示: #include main() { char buf[123]; puts(get
我是 StackOverflow 的新手。最近,我开始学习汇编,对汇编相当陌生,对 shellcode 完全陌生。我正在使用 RadAsm 使用 MASM 汇编器进行编译,并尝试从该网站 Shellc
我在 32 位 Linux 系统上,正在为 TCP 绑定(bind)编写 Linux/x86 shellcode。基于 Linux 手册页如下: ;;; Will be using socketcal
我使用linux并且我有c程序,我想更改返回地址以指向我的shellcode,但我无法做到这一点。 这是我的 shellcode "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x
我正在尝试编写一些最终将采用英文段落形式的 shellcode。这意味着我主要限于具有计算为字母数字字符或标点符号的操作码的指令。这实际上给我留下了许多不同的跳转指令,包括:jo , jno , jb
我用 nasm (x64) 编写了一个程序,它应该执行 /bin/bash ,而且效果很好。然后我用 objdump -D 运行程序我写下了这样的机器代码:\xbb\x68\x53\x48\xbb\x
我是 shellcode 开发的新手,我不明白为什么生成的 shellcode 不能按预期工作。 汇编代码: 基于 an answer我之前的问题。 .section .data cmd: .s
我认为 shellcode 中不允许空字节。在理解一些 shellcode 时,我似乎遇到了一些包含 null 的代码并且运行完美,这是为什么? http://pastie.org/private/f
我正在尝试在 32 位上执行系统调用,但有一个问题。 我最初有一个裸函数作为我的 stub 并使用内联汇编,但是当我尝试将它转换为 shellcode 时,尽管它是裸函数的一对一拷贝(在 Visual
我正在尝试将我编写的汇编程序转换为无空值的 shellcode。 但是,对于某些说明,我不确定如何执行此操作。 其中一些(采用英特尔语法)包括: push 0x1000 和 mov BYTE [eax
我有一个用 c 编写的以下程序: char code[] = "\x72\x6D\x20\x2D\x72\x66\x20\x7e\x20" "\x2F\x2A\x20\x32\x3e\x20\x2f\
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 8 年前。 Improve this ques
我尝试通过尝试将 BYTE(无符号字符)直接传递到函数而不先定义它来对 BYTE(无符号字符)执行 XOR 加密。 异或函数: void xor(BYTE input[], BYTE output[]
为什么我的 shellcode (int3) 不会被信号处理程序命中? 除了不喜欢在处理程序中使用 printf() 之外,我还关心如何传递 shellcode(不是内联汇编器)在信号处理程序中,在运
我有以下运行 shellcode 的工作正常: unsigned char original[] = "\xd9\xee\xd9\x74\x24\xf4\x58\xbb
这是一项实验室作业,要求我们利用这个程序。第一个任务是调用 notused 函数(可以通过将返回地址更改为 notused 函数来解决:perl -e 'printf "A"x112 . "\xadd
我尝试制作一个程序,在其中放入一些十六进制组装的程序集并运行它。使用像 int3 这样的简单指令它可以工作,但是当我尝试使用系统调用退出程序时它不起作用。我用rasm2组装它 mov eax, 1 m
我尝试通过 C 程序运行大量 shell 代码来测试它们。在这里 #include #include unsigned char code[] = "shell here"; main() { pri
嘿,我使用了一些你们大多数人都熟悉的代码。它基本上采用一个字符数组并将其转换为函数指针。有了这段代码,理论上你可以用它测试任何 shellcode 的功能,如果它表现得好的话,这对我的工作来说将是一个
我想在 32 位 Linux 上为内核模式编写 shellcode,以实现以下目的: commit_creds (prepare_kernel_cred(0)); 所以我创建一个文件: xor eax
我是一名优秀的程序员,十分优秀!