首页 > 其他分享 >Hackpack 2023 逆向Re部分题解

Hackpack 2023 逆向Re部分题解

时间:2023-04-26 23:33:32浏览次数:44  
标签:tmp Hackpack 题解 rc Re ls ans print data

Hackpack2023-2023/4/15

image

https://ctf2023.hackpack.club/challenges

做了2题出来,其实是一题,第一题是手动逆向,第二题是脚本自动逆向

主要是学习到了nclib包使用

使用说明

https://nclib.readthedocs.io/en/latest/netcat.html

Speed-Rev

题目是在3分钟逆向6题

第一题是直接找字符串,第二题和第三题是把字符串拆开变成一堆判断,

image

第四五六也是判断,不过给的是字与字关系

image

自动化脚本主要是要找到这些静态数据,自己写的时候是通过一些比较特殊的代码段所对应的数据来作为线索寻找

import nclib
import base64
import string
if __name__ == '__main__':
    TO=2
    obj=nclib.Netcat(('cha.hackpack.club',41702))
    
    rc=obj.recv_all(timeout=TO).decode()
    data=rc[rc.find('b\'')+2:-20].encode()
    ans=base64.decodebytes(data)[8196:8212]#固定位置
    print(ans.decode())
    obj.send(ans+b'\n')

    rc = obj.recv_all(timeout=TO).decode()
    data = base64.decodebytes(rc[rc.find('b\'') + 2:-20].encode())
    ls=data[4436:8212].split(b'<')
    ans=b''
    for i in range(1,17):
        ans+=ls[i][:1]
    print(ans.decode())
    obj.send(ans+b'\n')

    rc = obj.recv_all(timeout=TO).decode()
    data = base64.decodebytes(rc[rc.find('b\'') + 2:-20].encode())
    ls = data[4436:8212].split(b'<')
    ans = b''
    for i in range(1, 17):
        ans += ls[i][:1]
    print(ans.decode())
    obj.send(ans + b'\n')
    
    #像456题都是可能出现多种符合情况的flag,就生成一个可能的列表,筛选其中仅含字母数字的就行
    rc = obj.recv_all(timeout=TO).decode()#4
    data = base64.decodebytes(rc[rc.find('b\'') + 2:-20].encode())
    out=open('4','wb')
    out.write(data)
    ls = data[4448:5204].split(b't')#这里的t就是比较特殊的代码段
    tmp=[]
    for i in ls:
        if i[-1]==0 and i[-5]==ord('='):
            tmp.append(i[-4])
        else:
            if i[-1]!=233:
                tmp.append(i[-1])
    print(tmp)
    ans=[]
    for i in string.ascii_letters+string.digits:
        c = [i]
        mark=1
        for i in range(15):
            if tmp[i] - ord(c[i])>0:
                c.append(chr(tmp[i] - ord(c[i])))
            else:
                c.append('\\')
        if mark==1:
            ans.append(''.join(c))
    for i in ans:
        mark=1
        for j in i:
            if j not in string.ascii_letters+string.digits:
                mark=0
                break
        if mark==1:
            print(i)
            obj.send(i.encode()+b'\n')
            break

    rc = obj.recv_all(timeout=TO).decode()  # 5
    data = base64.decodebytes(rc[rc.find('b\'') + 2:-20].encode())
    out = open('5', 'wb')
    out.write(data)
    ls = data[4418:5204].split(b't')
    tmp = []
    for i in ls:
        h=[]
        if i:
            if len(i)>5 and i[-1] == 0 and i[-5] == ord('='):
                h=[i[-4],1]
                tmp.append(h)
            else:
                if i[-1]!=233:
                    h=[i[-1],0]
                    tmp.append(h)
    tmp=tmp[:15]
    print(tmp)
    ls=[]
    for i in string.ascii_letters+string.digits:
        h=tmp+[[ord(i),0]]
        h.reverse()
        ans=''
        for i in h:
            if i[1]==0:
                ans=chr(i[0])+ans
            elif i[1]==1:
                ans = chr(i[0]-ord(ans[0])) + ans
        ls.append(ans)
    print(ls)
    for i in ls:
        mark = 1
        for j in i:
            if j not in string.ascii_letters + string.digits:
                mark = 0
                break
        if mark == 1:
            print(i)
            obj.send(i.encode() + b'\n')
            break




    rc = obj.recv_all(timeout=TO).decode()  # 6
    data = base64.decodebytes(rc[rc.find('b\'') + 2:-20].encode())
    out.write(data)
    ls = data[4418:5204].split(b't')
    tmp = []
    for i in ls:
        h=[]
        if i:
            if len(i)>5 and i[-1] == 0 and i[-5] == ord('='):
                h=[i[-4],1]
                tmp.append(h)
            else:
                if i[-1]!=233:
                    h=[i[-1],0]
                    tmp.append(h)
    tmp=tmp[:15]
    print(tmp)
    ls=[]
    for i in string.ascii_letters+string.digits:
        h=tmp+[[ord(i),0]]
        h.reverse()
        ans=''
        for i in h:
            if i[1]==0:
                ans=chr(i[0])+ans
            elif i[1]==1:
                ans = chr(i[0]-ord(ans[0])) + ans
        ls.append(ans)
    print(ls)
    for i in ls:
        mark = 1
        for j in i:
            if j not in string.ascii_letters + string.digits:
                mark = 0
                break
        if mark == 1:
            print(i)
            obj.send(i.encode() + b'\n')
            break
    rc = obj.recv_all(timeout=TO).decode()  # 6
    print(rc)

群里大佬给的脚本,主要看solve,angr是一个基于python的二进制漏洞分析框架

https://blog.csdn.net/weixin_42016744/article/details/118517814

#!/usr/bin/env python3
from angr import Project, SimState, SimulationManager
from claripy import *
from pwn import *
from base64 import b64decode

def recv(p: tube, n: int=1, echo: bool=True) -> bytes:
    data = b''
    for _ in range(n):
        line = p.recvline(keepends=True)
        if echo:
            print('\033[1;30m%s\033[0m' % line.decode('utf-8'), end='')
        data += line
    return data

def recvp(p: tube, n: int, echo: bool=True) -> bytes:
    data = p.recv(n)
    if echo:
        print('\033[1;30m%s\033[0m' % data.decode('utf-8'), end='')
    return data

def send(p: tube, text: str | int | bytes) -> None:
    if isinstance(text, int):
        text = str(text)
    if isinstance(text, str):
        data = text.encode('utf-8')
        echo = text
    elif isinstance(text, bytes):
        data = text
        echo = repr(text)
    else:
        raise ValueError('invalid argument: %r' % text)
    p.sendline(data)
    print('\033[32m%s\033[0m' % echo)

def solve(filename: str) -> bytes:
    proj = Project(filename, auto_load_libs=False, main_opts={'base_addr': 0})#新建工程

    func = proj.loader.main_object.get_symbol('validate')#找到关键函数
    assert func.is_function
    addr = func.linked_addr

    flag = BVS('flag', 128)
    state: SimState = proj.factory.call_state(addr, flag)
    for i in range(16):
        state.solver.add(Or(
            And(flag.get_byte(i) >= ord('A'), flag.get_byte(i) <= ord('Z')),
            And(flag.get_byte(i) >= ord('a'), flag.get_byte(i) <= ord('z')),
            And(flag.get_byte(i) >= ord('0'), flag.get_byte(i) <= ord('9')),
        ))
    state.memory.store(state.regs.rsp, flag)
    state.regs.rdi = state.regs.rsp
    state.stack_push(0)
    state.stack_push(0)
    simgr = proj.factory.simulation_manager(state)
    def function_returns(simgr: SimulationManager) -> bool:
        if len(simgr.active) == 0:
            return True
        simgr.move('active', 'deadended', lambda state: state.addr == 0)
    simgr.run(until=function_returns)

    answer = b'1' * 16
    for state in simgr.deadended:
        state.solver.add(state.regs.eax == 0)
        if state.satisfiable():
            answer = state.solver.eval(flag, cast_to=bytes)
            # print(answer)
    return answer

def main() -> None:
    context.clear(arch = 'amd64')
    p = remote('cha.hackpack.club', 41702)
    recv(p, 2)

    for i in range(6):
        while True:
            data = recv(p, echo=False)
            if data.startswith(b'b\''):
                break
        assert data.endswith(b'\'\n')
        data = b64decode(data[2:-2])
        recv(p)
        filename = f'binary{i+1}'
        open(filename, 'wb').write(data)
        send(p, solve(filename))
        if recv(p) == b'Wrong!\n': break
    else: recv(p)

if __name__ == '__main__':
    main()

WASM-safe

web assembbly反编译

用jeb或者按照下面的方式

https://www.52pojie.cn/thread-962068-1-1.html

虽然没解出来,但是接触到新的wasm反编译

标签:tmp,Hackpack,题解,rc,Re,ls,ans,print,data
From: https://www.cnblogs.com/Joooook/p/17357718.html

相关文章

  • How to use axios.js instead of request.js to get data as a buffer All In One
    Howtouseaxios.jsinsteadofrequest.jstogetdataasabufferAllInOne如何使用axios.js代替request.js获取数据作为缓冲区questionconstfs=require("fs");varpath=require("path");const{exit}=require("process");//requ......
  • Vue3中ref和reactive的对比
     先说ref()和reactive()Vue3这两个API作用是相似的,只不过ref()是针对变量的响应式包装,而reactive()是针对对象的响应式包装。 ref()和reactive()对比API说明目标ref()传入一个值,返回一个响应式的变量变量reactive()返回一个对象的响应式代理。通过Proxy包......
  • leetcode-350-两个数组的交集 II 题解
    题目给定两个数组,编写一个函数来计算它们的交集。示例1:输入:nums1=[1,2,2,1],nums2=[2,2]输出:[2,2]示例2:输入:nums1=[4,9,5],nums2=[9,4,9,8,4]输出:[4,9]说明:输出结果中每个元素出现的次数,应与元素在两个数组中出现次数的最小值一致。我们可以不考虑输出结果......
  • 解决VMware Workstation安装VMware Tools显示灰色的办法
    想在VMwareWorkstation中安装VMwareTools,方便文件的复制粘贴。但是如下图,总是灰色按照网上教程设置方法一:1.关闭虚拟机;2.在虚拟机设置分别设置CD/DVD、CD/DVD2和软盘为自动检测三个步骤;3.再重启虚拟机,灰色字即点亮。灰色没有点亮。 接着尝试了方法二:1.关闭虚......
  • 学习(review)二——CSS(上)
    CSS(层叠样式表)一般通过<styletype="text/css">内部为CSS环境</style>进行编写CSS。使用CSS,您可以控制颜色、字体、文本大小、元素之间的间距、元素的位置和布局、要使用的背景图像或背景颜色、不同设备的不同显示和屏幕大小等等CSS一般用于修饰页面显示效果设计网页的样......
  • 在linux中如何读取使用tcpdump命令抓取保存的tcpdump capture file类型的数据文件
    笔者在之前的文章中,说明了如何在linux使用tcpdump命令进行抓包,以及将抓包结果保存到文件具体操作,可以参考:https://www.cnblogs.com/5201351/p/17357444.html如果是使用tcpdump命令,-wxxxxxx.dump这种方式保存的文件,我们可以通过file命令发现其文件类型[root@localhostqq-52......
  • CF1699A The Third Three Number Problem
    题意简述构造出一个三元组a,b,c使得(a⊕b)+(a⊕c)+(b⊕c)=n,若无解输出-1。符号⊕的意思为异或个人分析首先要了解异或符号的性质:1,x⊕0=x2,x⊕x=x根据异或符号的性质可以得到一下构造:a=b=0,c=n/2c=0,a=b=n/2通过上述可以发现答案都是偶数所以若n为奇则无解......
  • 王者荣耀英雄张良技能单词学习---continuous,intercept,battery,suppress 这四个单词
    刚刚用张良拿了首胜言灵·咒令(被动技能)被动:张良对任一敌人造成的相邻两次普攻或技能伤害的时间间隔若小于1.5秒,这两次伤害的间隔时间被视为“连续攻击状态”,该状态每积累满1.2秒,会使该敌人额外承受140(+50%法术加成)点真实伤害,该伤害随英雄等级每级成长10点。这个技能重点是连续,只......
  • mac 上安装redis
    苹果电脑可以通过Homebrew来安装Redis。请按照以下步骤进行操作:1.打开Terminal(终端)应用程序2.输入以下命令以安装Homebrew:```/bin/bash-c"$(curl-fsSLhttps://raw.githubusercontent.com/Homebrew/install/master/install.sh)"```3.输入以下命令以更新Homebrew,并检查是......
  • AtCoder Regular Contest 123 C 1, 2, 3 - Decomposition
    洛谷传送门AtCoder传送门从低位往高位考虑。设当前个位为\(k\),暴力搜索这一位向上进\(i\)位,设\(\left\lfloor\frac{n}{10}\right\rfloor-i\)的答案为\(t\)。若\(t>10i+k\)显然就不可行,因为就算个位全部填\(1\)也不能补齐;否则\(n\)的答案就是\(\max(t,\l......