对新手极其友好的送分题
1.拖进IDA
2.Shift+F12
3.Ctrl+F输入flag得到flag
9447{This_is_a_flag}
#include
#include
int main(int argc, char *argv[]) {
/*if (argc != 4) {
printf("what?\n");
exit(1);
}
unsigned int first = atoi(argv[1]);
if (first != 0xcafe) {
printf("you are wrong, sorry.\n");
exit(2);
}
unsigned int second = atoi(argv[2]);
if (second % 5 == 3 || second % 17 != 8) {
printf("ha, you won't get it!\n");
exit(3);
}
if (strcmp("h4cky0u", argv[3])) {
printf("so close, dude!\n");
exit(4);
}
printf("Brr wrrr grr\n");*/
unsigned int hash = 0xcafe * 31337 + (25 % 17) * 11 + 7 - 1615810207;
//由题意得first = 0xcafe second = 25(猜测) 第三个参数为“h4cky0u”的长度等于7
printf("Get your key: ");
printf("%x\n", hash);
return 0;
}
c0ffee
菜鸡拿到了一个被加壳的二进制文件(加壳?不存在的)
这题不用去壳都可以做
1.拖进IDA选择用二进制文件打开
2.shift+F12,Ctrl+F查找字符串flag
双击进入或者单机后将筛选框的flag删掉
得flag:flag{Upx_1s_n0t_a_d3liv3r_c0mp4ny}
在v7长整数上按一下R键转换为字符串型
小端序得v7=“harambe”;
然后根据后面的算法得出代码:
#include
#include
using namespace std;
int main(){
char v7[] = "harambe";
char v8[] = ":\"AL_RT^L*.?+6/46";
for(int i=0;i<strlen(v8);i++){
v8[i] = v8[i]^v7[i%7];
}
cout<<v8;
}
得出flag:
RC3-2016-XORISGUD
运行一下发现就是让你输入一个flag然后验证正确与否
二话不说,pyc反编译在线工具
需要注意的是这个网站反编译下来是有两串相同的代码的,复制一段就可
#!/usr/bin/env python
# encoding: utf-8
import base64
def encode(message):
s = ''
for i in message:
x = ord(i) ^ 32
x = x + 16
s += chr(x)
return base64.b64encode(s)
correct = 'XlNkVmtUI1MgXWBZXCFeKY+AaXNt'
flag = ''
print 'Input flag:'
flag = raw_input()
if encode(flag) == correct:
print 'correct'
else:
print 'wrong'
观察源码发现flag经过:
这里唯一需要了解的就是异或运算的逆运算还是异或运算 即:X ^ 32 ^ 32 = X
再一个,在我自己做题中发现一个问题,python中的base64函数与在线工具base64解码出来的答案貌似不同:
python:
在线工具:
用pyhton解出来的才是正确答案 (注意把前面的b删掉)
写出反编译代码:
correct = '^SdVkT#S ]`Y\\!^)\x8f\x80ism'
s = ''
for i in correct:
x = chr((ord(i)-16)^32)
s += x
print(s)
运行得flag:
nctf{d3c0mpil1n9_PyC}
zsctf{T9is_tOpic_1s_v5ry_int7resting_b6t_others_are_n0t}
想看更牛X解法的可以输完flag后去看攻防世界里面的WP,这里不做累述
(补充知识:C语言strcmp函数基本形式为strcmp(str1,str2),若str1=str2,则返回0;若str1
观察这一段就可,aSuccess是输出success提供验证作用,从这里出发可以看 到如果v10,v13的值相同则返回success,接着找v10怎么来的
整个过程的功能就是将输入的17位字符串转化为16进制串再与v13(即原16进制串)进行比较,如果相同就success,不同就wrong
所以直接把提供给你的那串16进制串:
437261636b4d654a757374466f7246756e
解码就行了
flag:
CrackMeJustForFun
最重要的一段代码,之后的是写入flag.txt文件的操作,不太重要。
可翻译成一下代码:
char v3;//前面定义的,打开IDA看
int v5 = 0;
while(v5<strlen(s)){
if(v5 & 1){
v3 = 1;
}
else v3 = -1;
t[v5+10] = s[v5] + v3;
v5++;//v5=v5+1;
}
char s[] = "c61b68366edeb7bdce3c6820314b7498";
char t[] = "SharifCTF{????????????????????????????????}";
根据以上内容写出大概的源码:
#include
#include
using namespace std;
int main(){
char s[] = "c61b68366edeb7bdce3c6820314b7498";
char t[] = "SharifCTF{????????????????????????????????}";
int v5 = 0;
int v3 = 0;
while(v5<strlen(s)){
if(v5 & 1){
v3 = 1;
}
else v3 = -1;
t[v5+10] = s[v5] + v3;
v5++;
}
cout<<t;
return 0;
}
SharifCTF{b70c59275fcfa8aebf2d5911223c6589}
DUTCTF{We1c0met0DUTCTF}
目前猜测最前面那个_mm_storeu_si128把v6的值传给了v5