首页 > 其他分享 >RE入门第四天---做新手题

RE入门第四天---做新手题

时间:2024-08-27 22:15:48浏览次数:3  
标签:esp int chr --- RE flag ebp 新手 range

题目来自polarDN

wp来自:

PolarCTF靶场Reverse方向简单难度Writeup - 这里是千夏 (l0serqianxia.github.io)

polar靶场reverse区简单难度题目详解 - 先知社区 (aliyun.com)

shell

考查:UPX自动脱壳

下载下来

ida打开

img

img

有壳的体现

尝试自动脱壳

D:\..CTFgoju\reverse\UPX\upx-4.2.4-win64\upx-4.2.4-win64

img

脱壳成功

ida打开,找到main主函数

img

flag{crack_is_funny}

PE结构

考查:PE文件结构

根据题目描述

010看看文件格式

果然有错误

将WZ改为MZ

img

运行得到flag

img

flag{66987add03c98a8f0cac71e4cafc2a6a}

拼接

一个白文件,名字为zip

拖进010一看,

看到PK

确定是zip

改后缀,

ida打开,看见两段flag

拼接得到flag

img

flag{03ff6cf238c5cd8e7b4ee1e9567ad5a4}

加加减减

改zip后缀,ida打开

可以看到将密文的每一位减了1,逆过来就OK

img

enc = 'ek`fz5123086/ce7ac7/`4a81`6/87b`b28a5|'
str = ''
for i in enc:
    str += chr(ord(i)+1)
print(str)
# flag{62341970df8bd80a5b92a7098cac39b6}

康师傅

还是改zip后缀

ida打开

进入main函数

看到

int __cdecl main_0(int argc, const char **argv, const char **envp)
{
  int v3; // edx
  int v5; // [esp-4h] [ebp-158h]
  unsigned int i; // [esp+D0h] [ebp-84h]
  char v7[60]; // [esp+DCh] [ebp-78h] BYREF
  char v8[43]; // [esp+118h] [ebp-3Ch] BYREF
  int v9; // [esp+143h] [ebp-11h]
  __int16 v10; // [esp+147h] [ebp-Dh]
  char v11; // [esp+149h] [ebp-Bh]
  int v12; // [esp+150h] [ebp-4h]
  int savedregs; // [esp+154h] [ebp+0h] BYREF

  sub_459319(&unk_53B006);
  strcpy(v8, "oehnr8>?;<?:9k>09;hj00o>:<o?8lh;8h9l;t");
  *(_DWORD *)&v8[39] = 0;
  v9 = 0;
  v10 = 0;
  v11 = 0;
  sub_457EB0(v7, 0, 50);
  ((void (__cdecl *)(_DWORD))sub_45748D)(&unk_510E84);
  sub_457929(&unk_510E50, (char)v7);
  for ( i = 0; i < sub_457672(v7); ++i )
    v7[i] ^= 9u;
  if ( sub_459512(v8, v7) )
    ((void (__cdecl *)(_DWORD))sub_45748D)("error");
  else
    ((void (__cdecl *)(_DWORD))sub_45748D)("right");
  sub_45957B(&savedregs, &dword_45E57C, 0, v3);
  return sub_4593E1((unsigned int)&savedregs ^ v12, v5);
}

密文的加密逻辑是异或9u

img

img

写脚本逆过来

但是脚本是异或9还是9u还是u喃

都试试看

enc = 'oehnr8>?;<?:9k>09;hj00o>:<o?8lh;8h9l;t'
str = ''
for i in enc:
    str += chr(ord(i)^9)
print(str)
#flag{17625630b7902ac99f735f61ea21a0e2}

最后试了异或9,不知道为什么

键位命令补充

按R键9u变成\t,按H键\t变9u

flag{17625630b7902ac99f735f61ea21a0e2}

×另辟蹊径

需要点击10000次,这种小游戏题最坏的解决方法是通关,

多的情况还是逆

OK学新东西

img

【原创】CE教程:基础篇 - 『软件调试区』 - 吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

[CE修改器使用教程 基础篇] - lyshark - 博客园 (cnblogs.com)

img

不知道为什么CE进程老是出问题,不管了这题先放一下

flag{60983973c2ab87436914d71000e4b4e4}

use_jadx_open_it

一个apk软件

img

根据名字,用jadx打开apk软件

jadx下载地址

jadx反编译—下载和使用(傻瓜教程,非常详细)_jadx使用教程-CSDN博客

Release 1.5.0 · skylot/jadx · GitHub

源代码中找到flag

img

re2

ida打开main函数找到flag

img

flag{e10adc3949ba59abbe56e057f20f883e}

layout

jadx打开apk文件,发现flag,但是不对

img

文件名字为layout

在资源文件中找到

img

在main函数中找到flag

img

flag{andoird_re}

Why32

img

int __fastcall main(int argc, const char **argv, const char **envp)
{
  _main(argc, argv, envp);
  Start();
  return 0;
}

看见两个关键函数,一个个分析看

进入Start()

img

看到错误输入,说明else的Do函数才是重要的

int Do(void)
{
  int result; // eax
  char v1[40]; // [rsp+20h] [rbp-30h] BYREF
  int v2; // [rsp+48h] [rbp-8h]
  int i; // [rsp+4Ch] [rbp-4h]

  strcpy(v1, "2gfe8c8c4cde574f7:c6c;:;3;7;2gf:");
  result = 993475379;
  v1[33] = 0;
  v2 = 0;
  for ( i = 0; i <= 31; ++i )
  {
    result = v1[i] - 2;
    if ( str[i] != result )
    {
      result = puts("you are wrong");
      v2 = 1;
      break;
    }
  }
  if ( !v2 )
    return puts("Half right,think more");
  return result;

这里输入成功返回的是字符创减2的效果,能用逆,直接脚本完事

flag="2gfe8c8c4cde574f7:c6c;:;3;7;2gf:"

for i in flag:
    print(chr(ord(i)-2),end="")
#0edc6a6a2abc352d58a4a98919590ed8

但是这个还不是flag

MD5解密看看

img

flag{F1laig}

?64

不要忘记运行

img

运行得到base64

img

ZmxBZ19pc2hlUmU=

flAg_isheRe

MD5加密

flag{5d15777a411724ee5d029caca1ca7298}

Sign Up

【2023秋季个人挑战赛】 找到正确的账号和密码 拼接起来MD5即是正确答案。 例如 账号123 密码 root 答案 : flag{md5(123root)}

ida打开,进入main函数

int __fastcall main(int argc, const char **argv, const char **envp)
{
  _main(argc, argv, envp);
  Input_Data();
  Check_Data();
  return 0;
}

进入Input_Data

int Input_Data(void)
{
  puts("请输入账号和密码:");
  gets((__int64)num);
  gets((__int64)password);
  puts(num);
  return puts(password);
}

进入int Check_Data(void)

int Check_Data(void)
{
  int j; // [rsp+20h] [rbp-10h]
  int i; // [rsp+24h] [rbp-Ch]
  int v3; // [rsp+28h] [rbp-8h]
  int v4; // [rsp+2Ch] [rbp-4h]

  v4 = 1;
  v3 = 1;
  for ( i = 0; i <= 6; ++i )
  {
    if ( num[i] + 1 != key_num[i] )
      v4 = 0;
  }
  for ( j = 0; j <= 3; ++j )
  {
    if ( password[j] + 2 != key_password[j] )
      v3 = 0;
  }
  if ( !v4 && !v3 )
    return puts("账号密码错误:");
  if ( !v4 )
    return puts("账号错误:");
  if ( v3 )
    return printf("密码正确!");
  return puts("密码错误:");
}

OK,input的数值在哪里

直接进入input找

点击password交叉引用看看在哪里

img找到账号密码

192168109

root

img

img

现在分析check函数

在Input_Data函数输入num和password,在Check_Data函数如果想输出"密码正确!",需要同时满足v3 = 1v4 = 1

num为key_num每一位ascll码减1,password为key_password每一位ascll码减2

这里要注意mun遍历的是前7位,最后2位没有遍历,所以不需要改变

key_num = '1921681'
key_password = 'root'
num = ''.join(chr(ord(i)-1) for i in key_num)
password = ''.join(chr(ord(j)-2) for j in key_password)
print(num,'09',password,sep='')
# 081057009pmmr

MD5加密得到

flag{aa07caa2ff9e5b774bfca3b1f20c3ea0}

easyre1

int __cdecl main(int argc, const char **argv, const char **envp)
{
  __isoc99_scanf("%s", &flag);
  enkey();
  reduce();
  check();
  return 0;
}

1

int enkey()
{
  int i; // [esp+Ch] [ebp-4h]

  for ( i = 0; i <= 31; ++i )
    *(_BYTE *)(i + 134520992) ^= *(_BYTE *)(i + 134520896);
  return 0;
}

2

int reduce()
{
  int i; // [esp+Ch] [ebp-Ch]

  for ( i = 0; i <= 30; ++i )
    --*(_BYTE *)(i + 134520992);
  putchar(10);
  return 0;
}

3

int check()
{
  if ( !strcmp(&flag, "d^XSAozQPU^WOBU[VQOATZSE@AZZVOF") )
    return puts("you are right");
  else
    return puts("no no no");
}

代码逻辑就是密文和key异或,然后自身减了1

(目前判断先后顺序就是从上往下)

img

脚本解密

enc = 'd^XSAozQPU^WOBU[VQOATZSE@AZZVOF'
key = '5055045045055045055045055045055'
flag=''
for i,j in zip(enc,key):
    i = ord(i) + 1
    flag += chr(i ^ ord(j))
print(flag)
# PolarDNbecomesbiggerandstronger

flag{PolarDNbecomesbiggerandstronger}

×babyRE

这题没有看懂wp,

乱七八糟的,现在是入门不管这些

反正就是密文+2=flag

img

flag = "asdfgcvbnmjgtlop"
flag_ = ""
for i in range(len(flag)):
    flag_ += chr(ord(flag[i]) + 2)
print(flag_)
#cufhiexdpolivnqr

flag{cufhiexdpolivnqr}

32位ida打开

// bad sp value at call has been detected, the output may be wrong!
int __cdecl main(int argc, const char **argv, const char **envp)
{
  int v4; // [esp-Ah] [ebp-60h]
  int v5; // [esp-6h] [ebp-5Ch]
  _BYTE v6[48]; // [esp-2h] [ebp-58h] BYREF
  int v7; // [esp+2Eh] [ebp-28h]
  size_t v8; // [esp+32h] [ebp-24h]
  int v9; // [esp+36h] [ebp-20h]
  int v10; // [esp+3Ah] [ebp-1Ch]
  int *v11; // [esp+4Ah] [ebp-Ch]

  v11 = &argc;
  init();
  *(_DWORD *)&v6[2] = 0;
  v7 = 0;
  memset(&v6[4], 0, 4 * (((&v6[2] - &v6[4] + 50) & 0xFFFFFFFC) >> 2));
  v10 = 0;
  v9 = 0;
  puts("Please enter flag\n");
  ((void (__stdcall *)(const char *, _BYTE *, int, int, _DWORD))__isoc99_scanf)("%s", &v6[2], v4, v5, *(_DWORD *)v6);
  v8 = strlen(&v6[2]);
  fun1(&v6[2], v8);
  if ( check(&v6[2], v8) )
    puts("RIGHT");
  else
    printf("Try again");
  return 0;
}

进入fun1

将i+a1看作一个整体

img

int __cdecl fun1(int a1, int a2)
{
  int i; // [esp+Ch] [ebp-4h]

  for ( i = 0; i < a2; ++i )
    *(_BYTE *)(i + a1) ^= 1u;
  return 0;
}

img

int __cdecl check(int a1, int a2)
{
  char s[12]; // [esp+8h] [ebp-20h] BYREF
  int v4; // [esp+14h] [ebp-14h]
  int v5; // [esp+18h] [ebp-10h]
  int i; // [esp+1Ch] [ebp-Ch]

  strcpy(s, "shfiu777");
  v4 = 0;
  v5 = 0;
  if ( strlen(s) != a2 )
    return 0;
  for ( i = 0; i < a2; ++i )
  {
    if ( *(_BYTE *)(i + a1) != s[i] )
      return 0;
  }
  return 1;
}

就是密文异或1=返回right,就是flag

enc = 'shfiu777'
flag = ''
for i in enc:
    flag += chr(ord(i)^1)
print(flag)
# right666

MD5加密

flag{f9239748ca798af5d838ac8699bb5d3d}

一个flag劈三瓣儿

ida打开拼接flag即可

img

int flag()
{
  printf("flag{HaiZI233");
  printf("N145wuD!");
  return printf("le112@666}");
#flag{HaiZI233N145wuD!le112@666}

EasyCPP2

找到加密函数

__int64 encode(void)
{
  __int64 result; // rax
  int i; // [rsp+0h] [rbp-4h]

  for ( i = 0; i <= 15; ++i )
  {
    flag[i] += 3;
    result = i;
    flag[i] ^= 1u;
  }
  return result;

OK

shift+F12找到可疑密文

qisngksofhuivvmg

img

img

的确是

还是密文+3在异或1得到flag

flag = list("qisngksofhuivvmg")
for i in range(len(flag)):
    flag[i] = chr(ord(flag[i]) + 3)
    flag[i] = chr(ord(flag[i]) ^ 1)

print("".join(flag))
#umwpkowshjymxxqk

flag{umwpkowshjymxxqk}

crc

好多串16进制代码

根据名字看是不是crc32爆破

img

就是将v11中从索引为0之后的4位字符crc32加密与d1f4eb9

a比较

img

就是将v11中从索引为4之后的1位字符crc32与15d54739比较

from binascii import crc32
for i in range(128):
    for j in range(128):
        for k in range(128):
            for l in range(128):
                string=chr(i) + chr(j) + chr(k) + chr(l)
                if crc32(string.encode()) == 0xd1f4eb9a:
                    print(string)
#flag
from binascii import crc32

for i in range(128):
    if crc32(chr(i).encode()) == 0x15d54739:
        print(chr(i))

# {

得到flag{

可以得出就是crc32爆破

from binascii import crc32
for i in range(128):
    for j in range(128):
        for k in range(128):
            for l in range(128):
                string=chr(i) + chr(j) + chr(k) + chr(l)
                if crc32(string.encode()) == 0xd1f4eb9a:
                    print(string)
#flag
for i in range(128):
    if crc32(chr(i).encode()) == 0x15d54739:
        print(chr(i))

# {
for i in range(128):
    for j in range(128):
        for k in range(128):
            for l in range(128):
                string=chr(i) + chr(j) + chr(k) + chr(l)
                if crc32(string.encode()) == 0x540bbb08:
                    print(string)

for i in range(128):
    for j in range(128):
                string=chr(i) + chr(j)
                if crc32(string.encode()) == 0x3fcbd242:
                    print(string)


for i in range(128):
    for j in range(128):
        for k in range(128):
            for l in range(128):
                string=chr(i) + chr(j) + chr(k) + chr(l)
                if crc32(string.encode()) == 0x2479c623:
                    print(string)
for i in range(128):
    string = chr(i)
    if crc32(string.encode()) == 0xfcb6e20c:
        print(string)
"""
flag
{
ezre
by
zhsh
}

"""
import binascii
import string

chars = string.printable
def crc4(target):
    for a in chars:
        for b in chars:
            for c in chars:
                for d in chars:
                    str1 = a + b + c + d 
                    if(target == "{:0>8s}".format("%x"%(binascii.crc32(str1.encode("utf-8")) & 0xffffffff))):
                        print(str1)
                        return

def crc1(target):
    for a in chars:
        str1 = a
        if(target == "{:0>8s}".format("%x"%(binascii.crc32(str1.encode("utf-8")) & 0xffffffff))):
            print(str1)
            return

def crc2(target):
    for a in chars:
        for b in chars:
            str1 = a + b
            if(target == "{:0>8s}".format("%x"%(binascii.crc32(str1.encode("utf-8")) & 0xffffffff))):
                print(str1)
                return

crc4("d1f4eb9a")
crc1("15d54739")
crc4("540bbb08")
crc2("3fcbd242")
crc4("2479c623")
crc1("fcb6e20c")

flag{ezrebyzhsh}

代码解释

如果没有.encode()

会出现

img

结语

img

OK,polarDN平台现有的revesre的简单题ak了,不管是看wp还是啥,想达到的效果达到了。

虽然解了10多题,花费了将近3小时,但是事实是没有一点进步,都是一些基础了不能再基础的知识,但是也不是没有作用,只不过作用少。

RE未来学习

1.还是得看课学习,练习相应知识点的题目,巩固,总结,提升

标签:esp,int,chr,---,RE,flag,ebp,新手,range
From: https://www.cnblogs.com/yanxiao777/p/18383649

相关文章

  • NLP从零开始------14.文本中阶序列处理之语言模型(2)
    3.2长短期记忆        梯度消失问题的一个解决方案是使用循环神经网络的变体——长短期记忆( long short- term memory, LSTM)。        长短期记忆的原理是, 在每一步t, 都保存一个隐状态和一个单元状态( cell state) , 通过单元状态来存储长距离......
  • 设计模式-策略模式
    1.概念定义        策略模式是一种行为型设计模式,它定义了一系列算法,并将每一个算法封装起来,使它们可以互相替换,从而让算法的变化不会影响到使用算法的客户。策略模式使得算法可以在不影响客户端的情况下发生变化。        在策略模式中,我们将不同的算法封......
  • yum install epel-release, except KeyboardInterrupt, e:, SyntaxError: invalid syn
     yuminstallepel-release File"/usr/bin/yum",line30   exceptKeyboardInterrupt,e:                           ^SyntaxError:invalidsyntax问题原因:由于yum包管理是使用python2写的,由于python3与python2不兼容导致出......
  • 8.27 模拟赛(2019 CSP-S 真题)
    省流:预计\(40+0+15+0\),实际\(35+4+15+0\)。比赛复盘开局浏览题。A没太看懂(廊桥是什么?机场里有这玩意?);B题很好读懂,但没思路;C括号序列感觉可做;D一眼不会。除C外都感觉没太有戏。顺序开题。看懂A后,分析了一段时间后忘记了题面中“先到先得”的原则,导致推到一些歪的贪心浪......
  • 【新手福利】Windows Edge浏览器概述
    MicrosoftEdge浏览器,这是微软推出的一款基于Chromium的现代浏览器,用于Windows、macOS、iOS和Android平台。MicrosoftEdge提供了许多功能,包括隐私保护、内置的密码管理器、集成的Cortana支持(仅限Windows版本)、扩展支持等。以下是关于MicrosoftEdge的一些基本信......
  • Linux firewalld防火墙学习总结
    实践环境CentOS-7-x86_64-DVD-2009简介Firewalld是一种简单的、有状态的、基于区域(zone-based)的防火墙。策略和区域用于组织防火墙规则。网络在逻辑上被划分为多个区域,它们之间的流量可以通过策略进行管理。查看防火墙状态#servicefirewalldstatus或者#systemctls......
  • 淘宝flexible + rem
    rem页面 <style>html{font-size:100px;}div{/*相对于100px*/font-size:1rem;}</style><div>rem单位</div> flexible <!DOCTYPEhtml><htmllang="en">&l......
  • begin-预览,不行啊还是太弱了
    方便管理,主要是想熟悉下git的操作先创建并且切换到一个新的分支:gitcommit--allow-empty-am"beforestartingPA1"gitcheckout-bPA1其中--allow-empty表示允许提交一个空的提交,git默认是不能提交一个空的提交信息,如果当前的文档没有什么修改,那么就是不能提交的,但是加上......
  • MalusAdmin--- .NET 和 Vue3 实现的开源权限管理系统
    前言今天推荐一款用.NET和Vue3实现的开源权限管理系统。它的界面清爽干净,功能强大,还具备灵活的角色权限分配功能,能够满足不同规模企业的管理需求。无论你是开发新手还是大神,都能轻松上手,快速搭建起自己的权限管理体系。别再犹豫了,赶快来试试吧!项目简介Malus是海棠的意思,顾......
  • [COCI2012-2013#1] SNAGA 题解
    前言题目链接:洛谷。题意简述定义\(f(x)\)表示不能整除\(x\)的最小正整数。给出数字\(n\),每次\(n\getsf(n)\),当\(n=2\)时停止。定义\(g(n)\)为这一过程中的数字个数,例如\(g(6)=4\)。给定\(l,r\),求\(\sum\limits_{i=l}^rg(i)\)。\(3\leql\ltr......