-
SECUINSIDE 2016 CYKOR_00001_PatchCTF 2016. 7. 10. 21:37이것은 CGC파일이다.
CGC는 데프콘에서 풀어봤던문제라 바로 풀긴했는데 그만큼 사람들도 이미 풀어봤던 문제고하니 빨리빨리 풀려서 긴장좀했다
뭐일단..
if ( write(1, (int)"What is your message?\n", 0x16u) )
write함수로 What is your messgae?를 출력해준다.
if ( read(0, (int)&v1, 24u, 10) ) { v19 = -1; } else if ( v1 != 72 || v2 != 52 ) { v19 = 7; } else if ( v3 != 80 || v4 != 80 ) { v19 = 6; } else if ( v5 != 89 || v6 != 95 ) { v19 = 5; } else if ( v7 != 83 || v8 != 51 ) { v19 = 4; } else if ( v9 != 67 || v10 != 85 ) { v19 = 3; } else if ( v11 != 73 || v12 != 78 ) { v19 = 2; } else if ( v13 != 83 || v14 != 73 ) { v19 = 1; } else { if ( v15 == 68 && v16 == 51 && write(1, (int)"+ Are you serious?\n", 0x13u) ) exit(0); v17 = sub_80480A0(); v19 = 0; } return v19; }
read함수로 v1을 24바이트만큼 받아주는데, 엄청나게 많은 if문들이 존재한다. 하나하나 알아가보면
H4PPY_S3CUINSID3라는 문자열이 만들어지고, 문자열이 맞다면 Are you serious? 라는 문자열을 출력해준다
그리고 어떠한 함수를 호출하는데, 오버플로우 벡터가 존재한다
char v1[64]; // [sp+28h] [bp-50h]@3
for ( i = 0; i < 0x40; ++i ) v1[i] = 0; if ( read(0, (int)v1, 128u, 10) ) // overflow { v4 = -1; } else { for ( i = 0; v1[i]; ++i ) ++v2; if ( write(1, (int)"- Why so serious?\n", 0x12u) ) exit(0); v4 = v2; }
v1[0x40]을 전부 0으로 초기화해주고, 128바이트를 입력받기때문에 오버플로우가 발생한다.
그럼 저 128바이트를 좀 작게 수정해주자.
80이 존재하는데, value < 50을 맞춰주면되니까 이하의 숫자로 패치해주면된다.
very very easy
'CTF' 카테고리의 다른 글
SECUINSIDE 2016 CYKOR_00002_patch (0) 2016.07.11 SECUINSIDE 2016 CYKOR_00001 (0) 2016.07.10 Backdoor CTF - Enter the Matrix (0) 2016.06.07 TJCTF - Java sandbox (0) 2016.05.31 TJCTF - gravitymud (0) 2016.05.30