2020년에 진행된 국정원 주최 사이버공격방어대회
오랫동안 컴퓨터에 당시 문제들을 묵혀놨다가 이제야 풀이 포스팅을 해본다.
당시는 거의 이런 대회에 나가본게 처음이라, 시간에 쫒겨서 캡쳐를 제대로 못한 부분이 많다.
Simple botnet 이라는 첫번째 리버싱 문제이다.
simple_botnet 이라는 이름의 바이너리 파일이 하나 주어진다.
file 명령어로 확인해보면
ELF 파일은 것을 알 수 있다.
ELF 는 리눅스 환경에서 실행가능한 파일이다.
한번 실행시켜 봤는데
아무런 동작도 없이 바로 프로그램이 종료된다.
자세히 보기위해 IDA 라는 디스어셈블러를 이용해
주어진 바이너리를 열어보았다.
main 함수의 수도코드를 한번 천천히 살펴보았다.
int __cdecl main(int argc, const char **argv, const char **envp)
{
unsigned int v4; // eax
unsigned int v5; // [rsp+1Ch] [rbp-4F4h]
int v6; // [rsp+20h] [rbp-4F0h]
int v7; // [rsp+24h] [rbp-4ECh]
int v8; // [rsp+28h] [rbp-4E8h]
__int64 v9; // [rsp+2Eh] [rbp-4E2h] BYREF
char s[10]; // [rsp+36h] [rbp-4DAh] BYREF
char v11[32]; // [rsp+40h] [rbp-4D0h] BYREF
char v12[32]; // [rsp+60h] [rbp-4B0h] BYREF
char v13[128]; // [rsp+80h] [rbp-490h] BYREF
char s1[1032]; // [rsp+100h] [rbp-410h] BYREF
unsigned __int64 v15; // [rsp+508h] [rbp-8h]
v15 = __readfsqword(0x28u);
if ( argc != 3 )
return -1;
v4 = atoi(argv[2]);
v5 = connection_establish(argv[1], v4);
if ( v5 != -1 )
{
strcpy(s, "run_shell");
strcpy(v11, "send_client_info");
strcpy(v12, "recv_server_info");
v9 = 0x216465646E616CLL;
memset(s1, 0, 0x400uLL);
v6 = strlen(s);
v7 = strlen(v11);
v8 = strlen(v12);
do_send(v5, &v9, 7LL);
do_recv(v5, s1, 1023LL);
if ( !strncmp(s1, "run_shell", v6) )
{
system(&s1[v6]);
}
else if ( !strncmp(s1, "send_client_info", v7) )
{
do_send(v5, "simple_bot v1.0", 15LL);
}
else if ( !strncmp(s1, "recv_server_info", v8) )
{
memset(v13, 0, sizeof(v13));
do_recv(v5, v13, 127LL);
if ( !strncmp(v13, "cce2020{", 4uLL)
&& v13[40] == 125
&& !strncmp(&v13[8], "2fe4b7f474e34cbc", 0x10uLL)
&& !strncmp(&v13[24], "ad5672dc66488ba3", 0x10uLL) )
{
do_send(v5, "success to validate for server", 30LL);
}
}
sleep(0xAu);
}
return -1;
}
이 부분이 main 함수의 코드인데
딱 봐도 눈에 띄는 부분이 보인다.
바로 아래쪽에 있는 이 조건문이다.
v13 변수를 어떤 문자열과 단순히 strncmp 하고 있는데,
cce2020{ 이라는 플래그 포맷이 있는걸 보면 이 부분이 플래그 인듯 하다.
v13이 cce2020{ 이고,
v13[8] 이 2fe4b7f474e34cbc 이고,
v13[24] 가 ad5672dc66488ba3이고,
마지막으로 v13[40] 이 125 면 되는데
사실 125는 ASCII 코드로 } 를 의미한다.
v13 변수의 인덱스와 비교하는 문자열의 갯수를 비교해보면
결국 플래그는 cce2020{2fe4b7f474e34cbcad5672dc66488ba3} 인것을 알 수 있다.
반응형
'CTF > 리버싱' 카테고리의 다른 글
[2020CCE] Easyransom - 리버싱 / IDA / HxD / XOR (42) | 2022.11.04 |
---|---|
[2020CCE] My Friend - 리버싱 / IDA / Python (56) | 2022.11.01 |
[SharkyCTF] SIMPLE - 리버싱 / 어셈블리어 / IDA (40) | 2022.08.27 |
[SharkyCTF] Z3ROBOTWAVES - 리버싱 / IDA (44) | 2022.08.16 |
[HouseplantCTF] thedanzman - 리버싱 / Python / ROT13 / Base64 (48) | 2022.06.17 |