- 因为是ELF文件,打开了ubuntu,但上面没装上IDA,只能gdb调试
- 首先,objdump -d Easy_ELF 查看一下汇编
- 由于不是很熟悉<unistd.h>,最后还是用windows的IDA打开了,准备静态分析:
首先找到main函数,F5:
- 中间的sub_8048451()函数就是判断的关键,上面的sub_8048434() 调用的是scanf()函数,if条件成立后sub_80484F7()函数会打印correct! 看来只要满足if就够了
_BOOL4 sub_8048451() { if ( byte_804A021 != 0x31 ) // c2 return 0; byte_804A020 ^= 0x34u; byte_804A022 ^= 0x32u; byte_804A023 ^= 0x88u; if ( byte_804A024 != 0x58 ) // c5 return 0; if ( byte_804A025 ) // c6 = 0,感觉不太对 return 0; if ( byte_804A022 != 0x7C ) // c3^0x32 return 0; if ( byte_804A020 == 0x78 ) // c1^0x34 return byte_804A023 == -0x23u; // c4 = return 0; }
最后的 byte_804A023 == -0x23u 在其上面先invert sign 改变标志为~(不太明白),右键Bitwise negate(按位取反)得到其反码,直接转化为其对应补码的反码,结果是 0xDDu ,这里可能是一种欺骗手段
- 之后写个脚本验证
flag 为: L 1 N U X ,第六个字符没有显示,应该是直接忽略吧c1 = 0x34 ^ 0x78 c2 = 0x31 c3 = 0x32 ^ 0x7C c4 = 0xDD ^ 0x88 c5 = 0x58 c6 = 0x0 print(chr(c1), chr(c2), chr(c3), chr(c4), chr(c5), chr(c6))
知识点
- 错误:No symbol table is loaded
当编译时,未加 - g 选项,则进入gdb环境中执行命令会出现No symbol table is loaded
例如 gcc -g test.c -o test // -g选项的意义是“生成调试信息,该程序可以被调试器调试” - 头文件:<unistd.h>
write有两种用法。
一种是:ssize_t write(int fd, const void *buf, size_t nbyte);
fd:文件描述符;
buf:指定的缓冲区,即指针,指向一段内存单元;
nbyte:要写入文件指定的字节数;
返回值:写入文档的字节数(成功);-1(出错)
write函数把buf中nbyte写入文件描述符handle所指的文档,成功时返回写的字节数,错误时返回-1.
另一种是: write(const char* str,int n)
str是字符指针或字符数组,用来存放一个字符串。n是int型数,它用来表示输出显示字符串中字符的个数。
write("string",strlen("string");表示输出字符串常量