# Jmp / 花指令 / ShellCode / 立即数
Pwner: 4riH04X
t1d 在愚人节出的题,师傅精力就是好啊,我都不敢想他出这个题算偏移有多累。
很有愚人节的感觉,在师傅的一些旁敲侧击下也是学到了很多 re 的知识。
# 1.nmsl
# 【Done】ret2text
# 1. 立即数作用
pwn 题目运行 shellcode,一般是采用寄存器跳转,即 jmp rax
此类,那么其实可以通过跳转寄存器获取 shellcode 存放地址,并且将 /bin/sh 直接镶入 shellcode 后面,简化 shellcode 书写。
同时,有些题目会对 shellcode 有所限制,限制只能包含可打印字符或者纯粹字母数字。这就限制了 shellcode 的书写, mov
和 syscall
都会遭到限制, 可用指令如下:
1 | 1.数据传送: |
# 2. 代码混淆
backdoor, 这是混淆过的,但 EB 是 jmp 的机器码,我们尝试手动去除花指令。
1 | .text:0000000000401D45 ; __int64 __fastcall sub_401D45(__int64) |
# 3. 后门函数还原
# 4.exp
1 | from pwn import* |
# 2.Faker
# Shellcode/orw
一道会把输入 base64 转码的题(MLM 说是 sha256,导致走了弯路),但测试后加密只会加密一部分,16 个数字加密后发现有 4 个字节不会被加密,
1. 我们可以一开始去凑 jmp 10 这个字节,让加密后为这个指令,中间可以填充无用字节,跳到未加密的 4 个字节。 一次就是 16 个字节
2. 在这未加密的 4 个字节里,完成 rdi,rsi,rdx,rax 的赋值,构造一次新输入。
3. 把输入设置成正在执行的代码块,注入 orw 的 shellcode
这里要注意 main 函数中 close (1),close (2) 文件描述符号后,需要在构造的 read 执行后将 fd:0 也 close 掉,因为这样才能够正确的用文件描述符 3 发挥作用。
1 | from pwn import* |