[攻防世界][Reverse]xxxorrr

攻防,世界,reverse,xxxorrr · 浏览次数 : 148

小编点评

**反汇编代码解释:** ```c # 目标文件包含两个字符串,s1 和 s2。 int decode() { // 初始化字符串存储器。 char s1[40]; char s2[33]; // 从输入中读取字符串。 fgets(s1, 35, stdin); // 对 s1 进行异或运算。 for (int i = 0; i < 33; ++i) { s1[i] ^= 2 * i + 65; } // 将异运算结果与 s2 进行比较。 if (strcmp(s1, s2) == 0) { // 如果 s1 和 s2 相同,打印提示信息。 puts("Congratulations!\n"); } else { // 如果 s1 和 s2 不相同,打印提示信息。 puts("Wrong!\n"); } // 打印最终结果。 return 0; } ``` **代码功能:** 1. 读取字符串 `s1`。 2. 对 `s1` 进行异或运算。 3. 将异运算结果与字符串 `s2` 进行比较。 4. 如果 s1 和 s2 相同,打印提示信息。 5. 如果 s1 和 s2 不相同,打印提示信息。 6. 打印最终结果。 **代码注释:** * `sub_A90` 和 `sub_916` likely 是回调函数,它们在 `main` 函数执行完后的回调。 * `s1` 和 `s2` 是目标文件的字符串。 * `s1` 的长度为 33,`s2` 的长度为 33。 * 异或运算的目的是将 `s1` 中的每个字符与 `s2` 中对应字符进行异或运算。 * 如果 `s1` 和 `s2` 相同,则表示输入的字符串与模板字符串匹配。

正文

将目标文件拖入IDA

反汇编main函数
__int64 __fastcall main(int a1, char **a2, char **a3)
{
  int i; // [rsp+Ch] [rbp-34h]
  char s[40]; // [rsp+10h] [rbp-30h] BYREF
  unsigned __int64 v6; // [rsp+38h] [rbp-8h]

  v6 = __readfsqword(0x28u);
  sub_A90((void (__fastcall *)(void *))sub_916);
  fgets(s, 35, stdin);
  for ( i = 0; i <= 33; ++i )
    s1[i] ^= s[i];
  return 0LL;
}
这里有一个sub_A90sub_916,怀疑是main执行完后的回调,看一下sub_916
unsigned __int64 sub_916()
{
  unsigned __int64 v1; // [rsp+8h] [rbp-8h]

  v1 = __readfsqword(0x28u);
  if ( !strcmp(s1, s2) )
    puts("Congratulations!");
  else
    puts("Wrong!");
  return __readfsqword(0x28u) ^ v1;
}
从这里可以看出确实是;这里有在对比 s1s2, 二者一样就ok
从main中可以看出s1对输入的字符串做了一个异或操作,那就是异或后再比较
找到s1 和 s2对应的字符串的值
    s1 = 'qasxcytgsasxcvrefghnrfghnjedfgbhn'
    s2 = [0x56, 0x4e, 0x57, 0x58, 0x51, 0x51, 0x09, 0x46,
          0x17, 0x46, 0x54,
          0x5A, 0x59, 0x59, 0x1F, 0x48, 0x32, 0x5B, 0x6B,
          0x7C, 0x75, 0x6E, 0x7E, 0x6E, 0x2F, 0x77, 0x4F,
          0x7A, 0x71, 0x43, 0x2B, 0x26, 0x89, 0xFE, 0x00]
发现sub_84A也有去操作s1,应该是在main函数执行之前执行的
unsigned __int64 sub_84A()
{
  int i; // [rsp+Ch] [rbp-14h]
  unsigned __int64 v2; // [rsp+18h] [rbp-8h]

  v2 = __readfsqword(0x28u);
  for ( i = 0; i <= 33; ++i )
    s1[i] ^= 2 * i + 65;
  return __readfsqword(0x28u) ^ v2;
}

可以反推出执行后的值,反推python代码为

def decode():
    s1 = 'qasxcytgsasxcvrefghnrfghnjedfgbhn'
    s2 = [0x56, 0x4e, 0x57, 0x58, 0x51, 0x51, 0x09, 0x46,
          0x17, 0x46, 0x54,
          0x5A, 0x59, 0x59, 0x1F, 0x48, 0x32, 0x5B, 0x6B,
          0x7C, 0x75, 0x6E, 0x7E, 0x6E, 0x2F, 0x77, 0x4F,
          0x7A, 0x71, 0x43, 0x2B, 0x26, 0x89, 0xFE, 0x00]

    t_s1 = []
    for i in range(33):
        t_s1.append(ord(s1[i]) ^ (2*i + 65))


    for j in range(33):
        t_val = t_s1[j] ^ s2[j]
        print(chr(t_val), end="")
    print("====")

    flag = ''
    for x in range(33):
        flag += chr(ord(s1[x])^ (2 * x + 65)^s2[x])

    print(flag)

if __name__ == '__main__':
    print('hello')
    decode()

得到 flag{c0n5truct0r5_functi0n_in_41f}

与[攻防世界][Reverse]xxxorrr相似的内容:

[攻防世界][Reverse]xxxorrr

将目标文件拖入IDA 反汇编main函数 __int64 __fastcall main(int a1, char **a2, char **a3) { int i; // [rsp+Ch] [rbp-34h] char s[40]; // [rsp+10h] [rbp-30h] BYREF uns

[攻防世界][Reverse]666

下载附件,是一个可执行的ELF文件666,拖进IDA中查看 main 函数反汇编得到 int __cdecl main(int argc, const char **argv, const char **envp) { char s[240]; // [rsp+0h] [rbp-1E0h] BYRE

[攻防世界][Web]PHP2

打开靶机对应的url 就一行字 Can you anthenticate to this website? 第一感觉就需要做目录文件扫描 使用御剑和dirsearch进行扫描,发现一个文件 index.phps 知识点: phps 是php标准中用来表示可以查看的php源文件的约定,不会被服务器执行

[攻防世界][Web]ics-06

打开靶机对应的url,展开是一个网站的样子,其实啥也么有 所有tab都点一遍,发现只有报表中心有内容,url为 http://61.147.171.105:49797/index.php?id=1 猜测这里是题眼,使用burpsuite的intruder直接爆id的值(0-10000) 最后发现id

[攻防世界][江苏工匠杯]unseping

打开靶机对应的url 上来就是代码审计 method =

[攻防世界][江苏工匠杯]file_include

打开靶机url,上来就是代码审计

[攻防世界][江苏工匠杯]easyphp

打开靶机url,上来就代码审计 6000000 && strlen

【Android 逆向】【攻防世界】基础android

1. 下载并安装apk,提示要输入密码 2. apk拖入到jadx中看一下 this.login.setOnClickListener(new View.OnClickListener() { // from class: com.example.test.ctf02.MainActivity.1

【Android 逆向】【攻防世界】android2.0

这是一道纯算法还原题 1. apk安装到手机,提示输入flag,看来输入就是flag 2. jadx 打开apk查看 this.button.setOnClickListener(new View.OnClickListener() { // from class: com.example.test

【Android 逆向】【攻防世界】APK逆向

1. apk安装到手机,提示输入flag 2. jadx打开apk 定位到checkSN方法 public boolean checkSN(String userName, String sn) { if (userName != null) { try { if (userName.length(