攻防世界|逆向|no-strings-attached

GDB使用教程

1.文件识别

猜测:像这种没有后缀的文件多半的linux的 ELF。
直接拖进PE识别工具 elf/32位
攻防世界|逆向|no-strings-attached_第1张图片
现在kali运行运行一下 运行不了
在这里插入图片描述

2.IDA分析

首先Shift+F12 查看字符串好像还有可用的
F5 获取main函数的伪代码

int __cdecl main(int argc, const char **argv, const char **envp)
{
  setlocale(6, &locale);
  banner();
  prompt_authentication();
  authenticate();
  return 0;
}

这里有四个函数,每个函数都跟进看看,发现 authenticate() 函数比较关键

2.1关键函数
void authenticate()
{
  int ws[8192]; // [esp+1Ch] [ebp-800Ch]
  wchar_t *s2; // [esp+801Ch] [ebp-Ch]

  s2 = decrypt(&s, &dword_8048A90);     // 特殊的函数decrypt
  if ( fgetws(ws, 0x2000, stdin) )
  {
    ws[wcslen(ws) - 1] = 0;
    if ( !wcscmp(ws, s2) )
      wprintf(&unk_8048B44);
    else
      wprintf(&unk_8048BA4);
  }
  free(s2);
}

然后我们发现一个特殊的函数decrypt,根据字面的意思是加密,那么我们可以大概的猜测是一个对dword_8048A90所对应的字符串进行加密,

这里我们有两种思维方式:

第一种就是跟进decrypt然后分析它的运算逻辑,然后,自己写脚本,得到最后的flag

第二种就涉及逆向的另一种调试方式,及动态调试,这里我就用动态调试了,之前的一直是静态调试

3.GDB动态调试

在Linux下的动态调试工具推荐使用 GDB

载入gdb

攻防世界|逆向|no-strings-attached_第2张图片

gdb ./no 载入gdb

下断点

攻防世界|逆向|no-strings-attached_第3张图片
b decrypt : 在decrypt 函数处下断点
r : 运行到下断点处
n:单步运行

查看eax的值

攻防世界|逆向|no-strings-attached_第4张图片

x: 就是用来查看内存中数值的,后面的200代表查看多少个
w:word(4字节)形式
$eax: 代表的eax寄存器中的值

在这里我们看到0x00000000,这就证明这个字符串结束了,因为,在C中,代表字符串结尾的就是"\0",那么前面的就是经过decrypt函数生成的falg

4.get flag

在这里插入图片描述
参考大神的方法直接查看 寄存器时
x/5sw $eax
s 表示字符串形式
5 表示5行

攻防世界|逆向|no-strings-attached_第5张图片

参考:https://adworld.xctf.org.cn/task/writeuptype=reverse&id=5080&number=4&grade=0&page=undefined
https://blog.csdn.net/qq_43656475/article/details/103089528

你可能感兴趣的:(逆向,ctf)