1.解题过程:
(1)
题中有提示,涉及密码
这个附件可以运行,输入测试
查壳
无壳,32位系统,拖入32位IDA中查看
shift+f12查找字符串
发现一个与密码相关的字符串,双击跳转
找到位置,f5一键反汇编查看伪代码
(2)分析:
若v10与v13相等,返回值为0,即 !0=1 输出Success
往回一路分析可以得出以下(如图)
按照我写的注释从1-9倒推
最后我们知道用户输入的是flag
当flag字符串转为十六进制数与v13中的数相等时为正确的值
所以只需要将v13的16进制数转换为文本则可得flag
我们可以验证一下
输入得出的字符串
2.知识点:
(1)IDA常用快捷键:
f5:一键反汇编
shift+f12:可以打开string窗口,一键找出所有的字符串
(2)伪代码中涉及到的函数:
① strcpy():
C 库函数 char *strcpy(char *dest, const char *src) 把 src 所指向的字符串复制到 dest
② memset():
C 库函数 void *memset(void *str, int c, size_t n) 复制字符 c(一个无符号字符)到参数 str 所指向的字符串的前 n 个字符
③strlen():
C 库函数 size_t strlen(const char *str) 计算字符串 str 的长度,直到空结束字符,但不包括空结束字符
④strcmp():
C 库函数 int strcmp(const char *str1, const char *str2) 把 str1 所指向的字符串和 str2 所指向的字符串进行比较
⑤strcat():
C 库函数 char *strcat(char *dest, const char *src) 把 src 所指向的字符串追加到 dest 所指向的字符串的结尾
⑥sprintf():
C 库函数 int sprintf(char *str, const char *format, ...) 发送格式化输出(按照格式说明所描述的文字规则进行输出)到 str 所指向的字符串
(3)asc_408044代表16进制
可以双击对应的代码返回查看编码
从左到右分别是内存地址,机器码,汇编指令
%x对应十六进制整型变量