逆向初学者做题记录  3.20

简单注册

解压完是apk文件,用jadx打开,tab键转换代码,找到关键代码:

然后写脚本

出结果

pyre

首先是这么个文件,不能直接打开,记事本打开也是一堆乱码,pycharm打开,是很短的代码

然后运行一下flag{hack1ng_fo1_fun},提交,果然不对,怎么能这么简单()

根据题目pyre,那就是python反编译了。

将这个文件在网站https://tool.lu/pyc/上打开

#!/usr/bin/env python
# visit https://tool.lu/pyc/ for more information
# Version: Python 2.7

print 'Welcome to Re World!'
print 'Your input1 is your flag~'
l = len(input1)
for i in range(l):
    num = ((input1[i] + i) % 128 + 128) % 128
    code += num

for i in range(l - 1):
    code[i] = code[i] ^ code[i + 1]

print code
code = [
    '%1f',
    '%12',
    '%1d',
    '(',
    '0',
    '4',
    '%01',
    '%06',
    '%14',
    '4',
    ',',
    '%1b',
    'U',
    '?',
    'o',
    '6',
    '*',
    ':',
    '%01',
    'D',
    ';',
    '%',
    '%13']

然后对这个代码逆向


code = [
    '\x1f',
    '\x12',
    '\x1d',
    '(',
    '0',
    '4',
    '\x01',
    '\x06',
    '\x14',
    '4',
    ',',
    '\x1b',
    'U',
    '?',
    'o',
    '6',
    '*',
    ':',
    '\x01',
    'D',
    ';',
    '%',
    '\x13']

l = len(code)
for i in range(l - 2,-1,-1):
    code[i] = chr(ord(code[i]) ^ ord(code[i + 1]))

for i in range(len(code)):
  print(chr((ord(code[i]) - i) % 128), end='')
  • 出现了异或运算,即:将每一位与后一位进行异或,那么最后一位是没有变的,就要从后往前来异或,然后因为数字计算机里起点为0(说不清楚,大概懂就行),就要从l-2开始

  • 然后是取余运算这个地方,一次取余和两次取余是一样的,一个数对它本身取余,结果为0

  • range()的参数可以是三个,range(起始点,终止点,步长),步长为-1的时候是以倒序进行;终止点为-1,就直流理解为0前的-1,因为range()输出的包括起始点不包括终止点

  • 对于end参数,python3版本不需要import就可以直接使用,但是2版本需要import

[ACTF新生赛2020]easyre

查个壳,upx壳!!有点激动,好久没有遇到有壳的题了

然后在upx目录下cmd,输入命令:upx -d 文件路径。会将原文件替换为脱壳文件。

ida里打开,找到main函数

int __cdecl main(int argc, const char **argv, const char **envp)
{
  char v4; // [esp+12h] [ebp-2Eh]
  char v5; // [esp+13h] [ebp-2Dh]
  char v6; // [esp+14h] [ebp-2Ch]
  char v7; // [esp+15h] [ebp-2Bh]
  char v8; // [esp+16h] [ebp-2Ah]
  char v9; // [esp+17h] [ebp-29h]
  char v10; // [esp+18h] [ebp-28h]
  char v11; // [esp+19h] [ebp-27h]
  char v12; // [esp+1Ah] [ebp-26h]
  char v13; // [esp+1Bh] [ebp-25h]
  char v14; // [esp+1Ch] [ebp-24h]
  char v15; // [esp+1Dh] [ebp-23h]
  int v16; // [esp+1Eh] [ebp-22h]
  int v17; // [esp+22h] [ebp-1Eh]
  int v18; // [esp+26h] [ebp-1Ah]
  __int16 v19; // [esp+2Ah] [ebp-16h]
  char v20; // [esp+2Ch] [ebp-14h]
  char v21; // [esp+2Dh] [ebp-13h]
  char v22; // [esp+2Eh] [ebp-12h]
  int v23; // [esp+2Fh] [ebp-11h]
  int v24; // [esp+33h] [ebp-Dh]
  int v25; // [esp+37h] [ebp-9h]
  char v26; // [esp+3Bh] [ebp-5h]
  int i; // [esp+3Ch] [ebp-4h]

  __main();
  v4 = 42;
  v5 = 70;
  v6 = 39;
  v7 = 34;
  v8 = 78;
  v9 = 44;
  v10 = 34;
  v11 = 40;
  v12 = 73;
  v13 = 63;
  v14 = 43;
  v15 = 64;
  printf("Please input:");
  scanf("%s", &v19);
  if ( (_BYTE)v19 != 65 || HIBYTE(v19) != 67 || v20 != 84 || v21 != 70 || v22 != 123 || v26 != 125 )
    return 0;
  v16 = v23;
  v17 = v24;
  v18 = v25;
  for ( i = 0; i <= 11; ++i )
  {
    if ( *(&v4 + i) != _data_start__[*((char *)&v16 + i) - 1] )
      return 0;
  }
  printf("You are correct!");
  return 0;
}

双击_data_start__,在HEX view里看到

开始写逆向代码

先分析一波:

  • 第50行,将_data_start__这个字符串的某一位与v4进行比较

  • _data_start__里有单引号,需要在它前面添加转义字符\

findit

jadx打开,找到关键的部分

package com.example.findit;

import android.os.Bundle;
import android.support.p003v7.app.ActionBarActivity;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

/* loaded from: classes.dex */
public class MainActivity extends ActionBarActivity {
    /* JADX INFO: Access modifiers changed from: protected */
    @Override // android.support.p003v7.app.ActionBarActivity, android.support.p000v4.app.FragmentActivity, android.app.Activity
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(C0130R.layout.activity_main);
        Button btn = (Button) findViewById(C0130R.C0132id.widget3);
        final EditText edit = (EditText) findViewById(C0130R.C0132id.widget2);
        final TextView text = (TextView) findViewById(C0130R.C0132id.widget1);
        final char[] a = {'T', 'h', 'i', 's', 'I', 's', 'T', 'h', 'e', 'F', 'l', 'a', 'g', 'H', 'o', 'm', 'e'};
        final char[] b = {'p', 'v', 'k', 'q', '{', 'm', '1', '6', '4', '6', '7', '5', '2', '6', '2', '0', '3', '3', 'l', '4', 'm', '4', '9', 'l', 'n', 'p', '7', 'p', '9', 'm', 'n', 'k', '2', '8', 'k', '7', '5', '}'};
        btn.setOnClickListener(new View.OnClickListener() { // from class: com.example.findit.MainActivity.1
            @Override // android.view.View.OnClickListener
            public void onClick(View v) {
                char[] x = new char[17];
                char[] y = new char[38];
                for (int i = 0; i < 17; i++) {
                    if ((a[i] < 'I' && a[i] >= 'A') || (a[i] < 'i' && a[i] >= 'a')) {
                        x[i] = (char) (a[i] + 18);
                    } else if ((a[i] >= 'A' && a[i] <= 'Z') || (a[i] >= 'a' && a[i] <= 'z')) {
                        x[i] = (char) (a[i] - '\b');
                    } else {
                        x[i] = a[i];
                    }
                }
                String m = String.valueOf(x);
                if (m.equals(edit.getText().toString())) {
                    for (int i2 = 0; i2 < 38; i2++) {
                        if ((b[i2] >= 'A' && b[i2] <= 'Z') || (b[i2] >= 'a' && b[i2] <= 'z')) {
                            y[i2] = (char) (b[i2] + 16);
                            if ((y[i2] > 'Z' && y[i2] < 'a') || y[i2] >= 'z') {
                                y[i2] = (char) (y[i2] - 26);
                            }
                        } else {
                            y[i2] = b[i2];
                        }
                    }
                    String n = String.valueOf(y);
                    text.setText(n);
                    return;
                }
                text.setText("答案错了肿么办。。。不给你又不好意思。。。哎呀好纠结啊~~~");
            }
        });
    }

    @Override // android.app.Activity
    public boolean onOptionsItemSelected(MenuItem item) {
        int id = item.getItemId();
        if (id == C0130R.C0132id.action_settings) {
            return true;
        }
        return super.onOptionsItemSelected(item);
    }
}

大概的作用就是对一串字符进行偏移,很像凯撒密码

找到网站解密一下

也可以用脚本来解密

# 恺撒密码加密
def Caesar_PW_Encryption():
    inputText = input("请输入明文文本: ")
    for index in inputText:
        if "a" <= index <= "z":
            print(chr(ord("a") + (ord(index) - ord("a") + 3) % 26), end='')
        elif "A" <= index <= "Z":
            print(chr(ord("A") + (ord(index) - ord("A") + 3) % 26), end='')
        else:
            print(index, end='')


# 恺撒密码解密
def Ceasar_PW_Decryption():
    inputText = input("请输入加密后文本: ")
    for index in inputText:
        if "a" <= index <= "z":
            print(chr(ord("a") + (ord(index) - ord("a") - 3) % 26), end='')
        elif "A" <= index <= "Z":
            print(chr(ord("A") + (ord(index) - ord("A") - 3) % 26), end='')
        else:
            print(index, end='')


if __name__ == '__main__':
    # 恺撒密码加密
    Caesar_PW_Encryption()

    # 恺撒密码解密
    Ceasar_PW_Decryption()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值