hgame week2
hgame ctf week2的逆向wp
题目链接:
链接: https://pan.baidu.com/s/12tZPC3uM_tkSY50YhNUC4w 密码: fvho
unpack
这是一个elf脱壳的题目,我用的方法是先运行程序,然后使用gdb attach到程序,然后dump出来,
首先是先使程序运行起来,
然后查一下这个程序运行时该进程的pid, 使用ps和grep指令,
然后看一下这个进程空间,cat /proc/[pid]/maps
然后使用gdb去:gdb attach [pid]
这里我是要使用root才可以attack成功,有点奇怪?
然后进入以后使用gdb的dump指令,
dump binary memory [path] start_addr end_addr
这里整个dump下来,然后就可以得到这个文件,看到加密还是很简单:
在ida可以看到地址,然后下断,继续运行程序,可以在得到内存中的值:
然后直接可以得到flag:
crackme
首先查壳是一个.net文件,用dnSpy做的,打开可以直接诶看到源码,
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