[HackIM2020]returminator

挺有意思的题,给了三个文件,py,elf和data

import subprocess

o = [296, 272, 272, 272, 296, 360, 272, 424, 272, 208, 120, 120, 120, 96, 120, 120, 120, 120, 120, 120, 120, 208, 120, 120, 208, 208, 208, 208, 208, 272, 120, 208, 208]
r = [208, 225, 237, 20, 214, 183, 79, 105, 207, 217, 125, 66, 123, 104, 97, 99, 107 , 105, 109, 50, 48, 202, 111, 111, 29, 63, 223, 36, 0, 124, 100, 219, 32]

cmd = ['./main']
rets = []

with open('blob', 'rb') as f:
    for offset in o:
        data = f.read(offset)
        p = subprocess.Popen(cmd, stdin=subprocess.PIPE)
        p.stdin.write(data)
        p.communicate()
        rets.append(p.returncode)

if all([rets[i] == r[i] for i in range(len(r))]):
    print('Yes!')
else:
    print('No!')

这个py将blob文件中的部分作为输入给了elf

看看elf

这个read导致可以栈溢出,看看blob

明显是个rop,输入的地址是gadgets,通过这个方法有点像vm

v={
    0x40119a: "pop     rdi retn",
    0x40119C: "pop     rsi retn",
    0x40119E: "pop     rdx retn",
    0x4011A0: "pop     rcx retn",
    0x4011A2: "pop     rax retn",
    0x4011A4: "add     rax, rdi retn",
    0x4011A8: "add     rax, rsi retn",
    0x4011AC: "add     rax, rdx retn",
    0x4011B0: "add     rax, rcx retn",
    0x4011B4: "add     rax, rax retn",
    0x4011B8: "add     rax, 1   retn",
    0x4011BD: "xor     rax, rax retn",
    0x4011C1: "sub     rax, rdi retn",
    0x4011C5: "sub     rax, rsi retn",
    0x4011C9: "sub     rax, rdx retn",
    0x4011CD: "sub     rax, rcx retn",
    0x4011D1: "sub     rax, 1   retn",
    0x4011D6: "movzx   rdi, byte ptr [rdi] retn",
    0x4011DB: "movzx   rsi, byte ptr [rsi] retn",
    0x4011E0: "movzx   rdx, byte ptr [rdx] retn",
    0x4011E5: "movzx   rcx, byte ptr [rcx] retn",
    0x4011EA: "mov     rdi, rax retn",
    0x4011EE: "mov     rsi, rax retn",
    0x4011F2: "mov     rdx, rax retn",
    0x4011F6: "mov     rcx, rax retn",
    0x4011FA: "mov     edi, 0 ;call    _exit",
    0x4011FF: "call    _exit",
    0x4040a0: "flag"
}

o = [296, 272, 272, 272, 296, 360, 272, 424, 272, 208, 120, 120, 120, 96, 120, 120, 120, 120, 120, 120, 120, 208, 120, 120, 208, 208, 208, 208, 208, 272, 120, 208, 208]

with open('blob', 'rb') as f:
    for offset in o:
        data = f.read(offset)
        for i in range(0,len(data),8):
            t=int.from_bytes(data[i:i+8], 'little')
            #print(hex(t))
            if t==0x6161616161616161:
                continue
            if t in v:
                print(v[t])
            else:
                print(hex(t))
        print("======================================")

得到

pop     rax retn
flag
pop     rdi retn
0x0
add     rax, rdi retn
mov     rdi, rax retn
movzx   rdi, byte ptr [rdi] retn
pop     rax retn
flag
pop     rsi retn
0x2
add     rax, rsi retn
mov     rsi, rax retn
movzx   rsi, byte ptr [rsi] retn
pop     rax retn
flag
pop     rdx retn
0x4
add     rax, rdx retn
mov     rdx, rax retn
movzx   rdx, byte ptr [rdx] retn
xor     rax, rax retn
add     rax, rdi retn
add     rax, rsi retn
add     rax, rdx retn
pop     rdi retn
0x64
sub     rax, rdi retn
mov     rdi, rax retn
call    _exit
======================================
pop     rax retn
flag
pop     rdi retn
0x6
add     rax, rdi retn
mov     rdi, rax retn
movzx   rdi, byte ptr [rdi] retn
pop     rax retn
flag
pop     rsi retn
0x8
add     rax, rsi retn
mov     rsi, rax retn
movzx   rsi, byte ptr [rsi] retn
pop     rax retn
flag
pop     rdx retn
0xa
add     rax, rdx retn
mov     rdx, rax retn
movzx   rdx, byte ptr [rdx] retn
xor     rax, rax retn
add     rax, rdi retn
add     rax, rsi retn
add     rax, rdx retn
mov     rdi, rax retn
call    _exit
======================================
pop     rax retn
flag
pop     rdi retn
0xc
add     rax, rdi retn
mov     rdi, rax retn
movzx   rdi, byte ptr [rdi] retn
pop     rax retn
flag
pop     rsi retn
0xe
add     rax, rsi retn
mov     rsi, rax retn
movzx   rsi, byte ptr [rsi] retn
pop     rax retn
flag
pop     rdx retn
0x10
add     rax, rdx retn
mov     rdx, rax retn
movzx   rdx, byte ptr [rdx] retn
xor     rax, rax retn
add     rax, rdi retn
add     rax, rsi retn
add     rax, rdx retn
mov     rdi, rax retn
call    _exit
======================================
pop     rax retn
flag
pop     rdi retn
0x12
add     rax, rdi retn
mov     rdi, rax retn
movzx   rdi, byte ptr [rdi] retn
pop     rax retn
flag
pop     rsi retn
0x1
add     rax, rsi retn
mov     rsi, rax retn
movzx   rsi, byte ptr [rsi] retn
pop     rax retn
flag
pop     rdx retn
0x1e
add     rax, rdx retn
mov     rdx, rax retn
movzx   rdx, byte ptr [rdx] retn
xor     rax, rax retn
add     rax, rdi retn
add     rax, rsi retn
sub     rax, rdx retn
mov     rdi, rax retn
call    _exit
======================================
pop     rax retn
flag
pop     rdi retn
0x3
add     rax, rdi retn
mov     rdi, rax retn
movzx   rdi, byte ptr [rdi] retn
pop     rax retn
flag
pop     rsi retn
0x16
add     rax, rsi retn
mov     rsi, rax retn
movzx   rsi, byte ptr [rsi] retn
pop     rax retn
flag
pop     rdx retn
0x3
add     rax, rdx retn
mov     rdx, rax retn
movzx   rdx, byte ptr [rdx] retn
xor     rax, rax retn
add     rax, rdi retn
add     rax, rsi retn
add     rax, rdx retn
pop     rdi retn
0x64
sub     rax, rdi retn
mov     rdi, rax retn
call    _exit
======================================
pop     rax retn
flag
pop     rdi retn
0x5
add     rax, rdi retn
mov     rdi, rax retn
movzx   rdi, byte ptr [rdi] retn
pop     rax retn
flag
pop     rsi retn
0x1d
add     rax, rsi retn
mov     rsi, rax retn
movzx   rsi, byte ptr [rsi] retn
pop     rax retn
flag
pop     rdx retn
0x1c
add     rax, rdx retn
mov     rdx, rax retn
movzx   rdx, byte ptr [rdx] retn
pop     rax retn
flag
pop     rcx retn
0x7
add     rax, rcx retn
mov     rcx, rax retn
movzx   rcx, byte ptr [rcx] retn
xor     rax, rax retn
add     rax, rdi retn
add     rax, rsi retn
add     rax, rdx retn
sub     rax, rcx retn
pop     rdi retn
0x64
sub     rax, rdi retn
mov     rdi, rax retn
call    _exit
======================================
pop     rax retn
flag
pop     rdi retn
0x9
add     rax, rdi retn
mov     rdi, rax retn
movzx   rdi, byte ptr [rdi] retn
pop     rax retn
flag
pop     rsi retn
0x11
add     rax, rsi retn
mov     rsi, rax retn
movzx   rsi, byte ptr [rsi] retn
pop     rax retn
flag
pop     rdx retn
0xb
add     rax, rdx retn
mov     rdx, rax retn
movzx   rdx, byte ptr [rdx] retn
xor     rax, rax retn
add     rax, rdi retn
add     rax, rsi retn
sub     rax, rdx retn
mov     rdi, rax retn
call    _exit
======================================
pop     rax retn
flag
pop     rdi retn
0x13
add     rax, rdi retn
mov     rdi, rax retn
movzx   rdi, byte ptr [rdi] retn
pop     rax retn
flag
pop     rsi retn
0x1b
add     rax, rsi retn
mov     rsi, rax retn
movzx   rsi, byte ptr [rsi] retn
xor     rax, rax retn
add     rax, rdi retn
add     rax, rsi retn
mov     rcx, rax retn
pop     rax retn
flag
pop     rdi retn
0xd
add     rax, rdi retn
mov     rdi, rax retn
movzx   rdi, byte ptr [rdi] retn
pop     rax retn
flag
pop     rsi retn
0xf
add     rax, rsi retn
mov     rsi, rax retn
movzx   rsi, byte ptr [rsi] retn
pop     rax retn
flag
pop     rdx retn
0x14
add     rax, rdx retn
mov     rdx, rax retn
movzx   rdx, byte ptr [rdx] retn
xor     rax, rax retn
add     rax, rdi retn
add     rax, rsi retn
add     rax, rdx retn
sub     rax, rcx retn
mov     rdi, rax retn
call    _exit
======================================
pop     rax retn
flag
pop     rdi retn
0x15
add     rax, rdi retn
mov     rdi, rax retn
movzx   rdi, byte ptr [rdi] retn
pop     rax retn
flag
pop     rsi retn
0x17
add     rax, rsi retn
mov     rsi, rax retn
movzx   rsi, byte ptr [rsi] retn
pop     rax retn
flag
pop     rdx retn
0x17
add     rax, rdx retn
mov     rdx, rax retn
movzx   rdx, byte ptr [rdx] retn
xor     rax, rax retn
add     rax, rdi retn
add     rax, rsi retn
add     rax, rdx retn
mov     rdi, rax retn
call    _exit
======================================
pop     rax retn
flag
pop     rdi retn
0x19
add     rax, rdi retn
mov     rdi, rax retn
movzx   rdi, byte ptr [rdi] retn
pop     rax retn
flag
pop     rsi retn
0x1a
add     rax, rsi retn
mov     rsi, rax retn
movzx   rsi, byte ptr [rsi] retn
xor     rax, rax retn
add     rax, rdi retn
add     rax, rsi retn
mov     rdi, rax retn
call    _exit
======================================
pop     rax retn
flag
pop     rdi retn
0x1e
add     rax, rdi retn
mov     rdi, rax retn
movzx   rdi, byte ptr [rdi] retn
call    _exit
======================================
pop     rax retn
flag
pop     rdi retn
0x9
add     rax, rdi retn
mov     rdi, rax retn
movzx   rdi, byte ptr [rdi] retn
call    _exit
======================================
pop     rax retn
flag
pop     rdi retn
0x8
add     rax, rdi retn
mov     rdi, rax retn
movzx   rdi, byte ptr [rdi] retn
call    _exit
======================================
pop     rax retn
flag
mov     rdi, rax retn
movzx   rdi, byte ptr [rdi] retn
call    _exit
======================================
pop     rax retn
flag
pop     rdi retn
0x1
add     rax, rdi retn
mov     rdi, rax retn
movzx   rdi, byte ptr [rdi] retn
call    _exit
======================================
pop     rax retn
flag
pop     rdi retn
0x2
add     rax, rdi retn
mov     rdi, rax retn
movzx   rdi, byte ptr [rdi] retn
call    _exit
======================================
pop     rax retn
flag
pop     rdi retn
0x3
add     rax, rdi retn
mov     rdi, rax retn
movzx   rdi, byte ptr [rdi] retn
call    _exit
======================================
pop     rax retn
flag
pop     rdi retn
0x4
add     rax, rdi retn
mov     rdi, rax retn
movzx   rdi, byte ptr [rdi] retn
call    _exit
======================================
pop     rax retn
flag
pop     rdi retn
0x5
add     rax, rdi retn
mov     rdi, rax retn
movzx   rdi, byte ptr [rdi] retn
call    _exit
======================================
pop     rax retn
flag
pop     rdi retn
0x6
add     rax, rdi retn
mov     rdi, rax retn
movzx   rdi, byte ptr [rdi] retn
call    _exit
======================================
pop     rax retn
flag
pop     rdi retn
0x7
add     rax, rdi retn
mov     rdi, rax retn
movzx   rdi, byte ptr [rdi] retn
call    _exit
======================================
pop     rax retn
flag
pop     rdi retn
0xb
add     rax, rdi retn
mov     rdi, rax retn
movzx   rdi, byte ptr [rdi] retn
pop     rax retn
flag
pop     rsi retn
0x0
add     rax, rsi retn
mov     rsi, rax retn
movzx   rsi, byte ptr [rsi] retn
xor     rax, rax retn
add     rax, rdi retn
add     rax, rsi retn
mov     rdi, rax retn
call    _exit
======================================
pop     rax retn
flag
pop     rdi retn
0x1d
add     rax, rdi retn
mov     rdi, rax retn
movzx   rdi, byte ptr [rdi] retn
call    _exit
======================================
pop     rax retn
flag
pop     rdi retn
0x1d
add     rax, rdi retn
mov     rdi, rax retn
movzx   rdi, byte ptr [rdi] retn
call    _exit
======================================
pop     rax retn
flag
pop     rdi retn
0x1d
add     rax, rdi retn
mov     rdi, rax retn
movzx   rdi, byte ptr [rdi] retn
pop     rax retn
flag
pop     rsi retn
0xd
add     rax, rsi retn
mov     rsi, rax retn
movzx   rsi, byte ptr [rsi] retn
xor     rax, rax retn
add     rax, rdi retn
sub     rax, rsi retn
mov     rdi, rax retn
call    _exit
======================================
pop     rax retn
flag
pop     rdi retn
0x1c
add     rax, rdi retn
mov     rdi, rax retn
movzx   rdi, byte ptr [rdi] retn
pop     rax retn
flag
pop     rsi retn
0xe
add     rax, rsi retn
mov     rsi, rax retn
movzx   rsi, byte ptr [rsi] retn
xor     rax, rax retn
add     rax, rdi retn
sub     rax, rsi retn
mov     rdi, rax retn
call    _exit
======================================
pop     rax retn
flag
pop     rdi retn
0x1c
add     rax, rdi retn
mov     rdi, rax retn
movzx   rdi, byte ptr [rdi] retn
pop     rax retn
flag
pop     rsi retn
0xf
add     rax, rsi retn
mov     rsi, rax retn
movzx   rsi, byte ptr [rsi] retn
xor     rax, rax retn
add     rax, rdi retn
add     rax, rsi retn
mov     rdi, rax retn
call    _exit
======================================
pop     rax retn
flag
pop     rdi retn
0x0
add     rax, rdi retn
mov     rdi, rax retn
movzx   rdi, byte ptr [rdi] retn
pop     rax retn
flag
pop     rsi retn
0x1b
add     rax, rsi retn
mov     rsi, rax retn
movzx   rsi, byte ptr [rsi] retn
xor     rax, rax retn
add     rax, rdi retn
sub     rax, rsi retn
mov     rdi, rax retn
call    _exit
======================================
pop     rax retn
flag
pop     rdi retn
0x17
add     rax, rdi retn
mov     rdi, rax retn
movzx   rdi, byte ptr [rdi] retn
pop     rax retn
flag
pop     rsi retn
0x18
add     rax, rsi retn
mov     rsi, rax retn
movzx   rsi, byte ptr [rsi] retn
xor     rax, rax retn
add     rax, rdi retn
sub     rax, rsi retn
mov     rdi, rax retn
call    _exit
======================================
pop     rax retn
flag
pop     rdi retn
0x1a
add     rax, rdi retn
mov     rdi, rax retn
movzx   rdi, byte ptr [rdi] retn
pop     rax retn
flag
pop     rsi retn
0x0
add     rax, rsi retn
mov     rsi, rax retn
movzx   rsi, byte ptr [rsi] retn
pop     rax retn
flag
pop     rdx retn
0x1
add     rax, rdx retn
mov     rdx, rax retn
movzx   rdx, byte ptr [rdx] retn
xor     rax, rax retn
add     rax, rdi retn
add     rax, rsi retn
sub     rax, rdx retn
mov     rdi, rax retn
call    _exit
======================================
pop     rax retn
flag
pop     rdi retn
0x13
add     rax, rdi retn
mov     rdi, rax retn
movzx   rdi, byte ptr [rdi] retn
call    _exit
======================================
pop     rax retn
flag
pop     rdi retn
0xb
add     rax, rdi retn
mov     rdi, rax retn
movzx   rdi, byte ptr [rdi] retn
pop     rax retn
flag
pop     rsi retn
0xc
add     rax, rsi retn
mov     rsi, rax retn
movzx   rsi, byte ptr [rsi] retn
xor     rax, rax retn
add     rax, rdi retn
add     rax, rsi retn
mov     rdi, rax retn
call    _exit
======================================
pop     rax retn
flag
pop     rdi retn
0x15
add     rax, rdi retn
mov     rdi, rax retn
movzx   rdi, byte ptr [rdi] retn
pop     rax retn
flag
pop     rsi retn
0x14
add     rax, rsi retn
mov     rsi, rax retn
movzx   rsi, byte ptr [rsi] retn
xor     rax, rax retn
add     rax, rdi retn
sub     rax, rsi retn
mov     rdi, rax retn
call    _exit
======================================

分析即可得到flag

原文地址:https://www.cnblogs.com/harmonica11/p/13513830.html