RE
1、babypy
ハード憎しみバイトコードは、一般的に逆のロジックを解析することができXOR
C = [ 0x7d、0x03の、0x7d、0x04の、0x57、0x17の、0x72、0x2d、0x62、0x11を、の0x4E、0x6a、0x5b、0x04が、0x4f、0x2c、0x18の、0x4c、0x3fを、0x44の、0x21で、0x4c、0x2d、0x4a、ただし0x22 ]
c.reverse()
フラグ =[]
のための I における範囲(LEN(C)):
もし私= LEN(C) - !1 :
プリント(CHR(C [i]は ^ C [I + 1 ])、終了= '' )
他:
プリント(CHR (C [I]))
フラグを取得します。
2、アンパック
その名のタイトル、シェルオフUPX手、簡単なものの、しかし、Linuxは初めてのオフがあります
IDAとデバッグ、F8はまで、F7キーを飛んでいない実行されません。
F7に移動し、F8キーを持っています
ジャンプ、F8へ
私たちは、F8キーを続け、エントリポイント0x400890を見ることができます
入り口に来て、ダンプ
#include <idc.idc>
の#define PT_LOAD 1つ
の#define PT_DYNAMIC 2
静的メイン(ボイド)
{
オートIMAGEBASE、StartImg、EndImg。
自動e_phoff。
自動e_phnumは、p_offsetに。
私の自動車、ダンプファイル。
IMAGEBASE = 0x400000 ;
StartImg = 0x400000 ;
EndImg = 0x0の。
もし(DWORD(IMAGEBASE)== 0x7f454c46 || Dワード(IMAGEBASE)== 0x464c457f )
{
場合(ダンプファイル=のfopen(" G:\\ダンプファイル"、" WB " ))
{
e_phoff = IMAGEBASE + QWORD(IMAGEBASE + 0x20の);
メッセージ(" e_phoff = 0X%X \ n " 、e_phoff)。
e_phnumは =ワード(IMAGEBASE + 0x38 )。
メッセージ(" e_phnumは= 0X%X \ n " 、e_phnumは)。
以下のための(iは= 0 ; I <e_phnumは、I ++ )
{
場合(DWORD(e_phoff)== PT_LOAD || Dワード(e_phoff)== PT_DYNAMIC)
{
p_offsetに= QWORD(e_phoff + 0x8という)。
StartImg = QWORD(e_phoff + 0×10 )。
EndImg = StartImg + QWORD(e_phoff + の0x28 )。
メッセージ(" オフセットn = 0X%X \、端= 0X%X = 0X%X開始" 、StartImg、EndImg、p_offsetに)。
ダンプ(ダンプファイル、StartImg、EndImg、p_offsetに);
メッセージ(" ダンプ・セグメント%d個のOK \ nは。" 、i)は、
}
e_phoff = e_phoff + 0x38 。
}
fseek関数(ダンプファイル、0x3cの、0 );
FPUTC($ 00 、ダンプファイル)。
FPUTC($ 00 、ダンプファイル)。
FPUTC($ 00 、ダンプファイル)。
FPUTC($ 00 、ダンプファイル)。
fseek関数(ダンプファイル、の0x28、0 );
FPUTC($ 00 、ダンプファイル)。
FPUTC($ 00 、ダンプファイル)。
FPUTC($ 00 、ダンプファイル)。
FPUTC($ 00 、ダンプファイル)。
FPUTC($ 00 、ダンプファイル)。
FPUTC($ 00 、ダンプファイル)。
FPUTC($ 00 、ダンプファイル)。
FPUTC($ 00 、ダンプファイル)。
FCLOSE(ダンプファイル)。
} 他にメッセージ(" ダンプERR。" );
}
}
静的ダンプ(ダンプファイル、startimg、endimg、オフセット)
{
オートI。
自動サイズ。
サイズ = endimg- startimg。
fseek関数(ダンプファイル、オフセット、0 );
以下のために(私は= 0 ; I <サイズ;私+ = 1 )
{
FPUTC(バイト(startimg + I)、ダンプファイル)。
}
}
IDAオープンで、ダンプファイルから見て、
ロジックは、スクリプトを保持し、非常に簡単です。
1,crackme
c#写的,关键代码
private void button1_Click(object sender, EventArgs e)
{
if (this.status == 1)
{
MessageBox.Show("你已经激活成功啦,快去提交flag吧~~~");
return;
}
string text = this.textBox1.Text;
if (text.Length != 46 || text.IndexOf("hgame{") != 0 || text.IndexOf("}") != 45)
{
MessageBox.Show("Illegal format");
return;
}
string base64iv = text.Substring(6, 24);
string str = text.Substring(30, 15);
try
{
Aes aes = new Aes("SGc0bTNfMm8yMF9XZWVLMg==", base64iv);
Aes aes2 = new Aes("SGc0bTNfMm8yMF9XZWVLMg==", "MFB1T2g5SWxYMDU0SWN0cw==");
string text2 = aes.DecryptFromBase64String("mjdRqH4d1O8nbUYJk+wVu3AeE7ZtE9rtT/8BA8J897I=");
if (text2.Equals("Same_ciphertext_"))
{
byte[] array = new byte[16];
Array.Copy(aes2.EncryptToByte(text2 + str), 16, array, 0, 16);
if (Convert.ToBase64String(array).Equals("dJntSWSPWbWocAq4yjBP5Q=="))
{
MessageBox.Show("注册成功!");
this.Text = "已激活,欢迎使用!";
this.status = 1;
}
else
{
MessageBox.Show("注册失败!\nhint: " + aes2.DecryptFromBase64String("mjdRqH4d1O8nbUYJk+wVu3AeE7ZtE9rtT/8BA8J897I="));
}
}
else
{
MessageBox.Show("注册失败!\nhint: " + aes2.DecryptFromBase64String("mjdRqH4d1O8nbUYJk+wVu3AeE7ZtE9rtT/8BA8J897I="));
}
}
catch
{
MessageBox.Show("注册失败!");
}
}
可见又是将输入分为两半,第一部分作为初始向量,使加密后的mjdRqH4d1O8nbUYJk+wVu3AeE7ZtE9rtT/8BA8J897I=变为Same_ciphertext_
第二部分将Same_ciphertext_和第二部分相加后加密为byte后将后十六位转为base64等于dJntSWSPWbWocAq4yjBP5Q==
就第一部分,已经得到了明文,密文,和密钥,根据aes加密的方式,只要将明文作为向量对密文进行解密就可得到真实的初始向量,
第二部分,因为只给了后半部分base64,将其转为十六进制,为了知道前面的部分,我以Same_ciphertext_123456789012345的格式进行加密,从而得到了其前半部分的十六进制,拼在一起后转为base64,再进行aes解密,得到第二部分
拼起来得到flag
hgame{L1R5WFl6UG5ZOyQpXHdlXw==DiFfer3Nt_w0r1d}
WEEK3
Misc
1,三重隐写
给了三个音频,其中一个播放时
扫码得到
AES key: 1ZmmeaLL^Typbcg3
第二个文件名有LSB可知是LSB隐写,用slienteye得到
Stegano key: uFSARLVNwVIewCY5
那么可猜到第三个音频是mp3隐写,用mp3stego得到
Zip Password: VvLvmGjpJ75GdJDP
打开压缩包得到flag.crypto
题目贴心的给了解密软件,得到flag
RE
1,oooollvm
其实这题我连混淆都没去~
本来看到ollvm,第一反应是想用deflat去的,结果总有几个流程算不清,就一直没再看,快结束了时候想起来看了看
这十分可疑啊
table1=['0x31','0x0E','0x10','0x38','0x06','0xA1','0x64','0x26','0x04','0x36','0xC1','0x2B','0xA4','0x07','0x7C','0x0C','0x94','0x06','0xC2','0x51','0xC4','0x01','0x4E','0xC1','0xB9','0x50','0xCE','0x8D','0xB1','0x45','0x44','0x9D','0x3F','0xA1']
table2=['0x59','0x68','0x73','0x56','0x6F','0xDD','0x25','0x61','0x40','0x69','0xA6','0x69','0xD9','0x47','0xD5','0x78','0xCB','0x7A','0xA4','0x28','0xBD','0x6E','0x4F','0xBA','0xA4','0x3D','0xB6','0xFB','0xEC','0x2F','0x12','0xF0','0x1A','0xBF']
for i in range(len(table1)):
table1[i]=int(table1[i],16)
table2[i]=int(table2[i],16)
for i in range(len(table2)):
for s in range(30,127):
if((~s & (table1[i]+i) | ~(table1[i]+i) & s)==table2[i]):
print(chr(s),end='')
continue
得到flag