#二进制选手的自我修养
作为一位二进制选手,re,pwn,crypto都是自己的必修课23333
这一题的出现也是偶然。某一天在写一个根据密钥自解密代码运行的程序。而如果输入的密钥是错误的,程序就会直接退出。那个时候突然想到,如果我输入的某一个密钥。解密出来的代码正好是一段恶意的代码会怎么样?顺着这个思路就有了这一题

密码学部分其实也是正好听做web的队友讲起过的padding oracle攻击方式。在仔细的研究了这种攻击方式之后,发现这种攻击正好适合我设想的情况。
1.在不知道密钥的情况,通过密码学攻击还原出明文的内容,然后进行逆向,获得一半的flag
2.在不知道密钥的情况下,通过padding oracle来控制解密出来的内容是shellcode,从而获得系统权限。

编译方式:
gcc main.c -g -fno-stack-protector -z execstack -lcrypto

PS:我还算很好心的,本来des打算用静态编译来着。而且因为自己失误,结果连符号都没有去掉

PS2:关于奇怪的main2.c。其实做题的时候,服务器端的代码是main2.c,而给选手的代码main.c。main2产生的理由有2个,一个是服务器上由于沙箱和一些环境原因,所以key文件和程序工作目录不是同一个,需要制定觉得路径。然而并不想因为绝对路径暴露服务器信息和对选手调试产生麻烦。
而服务器程序中的循环是因为根据本来的逻辑,如果填充校验不过应该直接退出。然而开启新线程开销很大,所以使用这种方法来减少开销,结合沙箱的自动重启机制。我相信没有什么选手在比赛中发现服务器上程序和自己拿到的不是同一个