CTF/포너블

[2020CCE] Simple Cmdshell / Simple Patch - 포너블 / IDA

SecurityMan 2022. 10. 24. 11:00

 

2020년에 진행된 국정원 주최 사이버공격방어대회

 

오랫동안 컴퓨터에 당시 문제들을 묵혀놨다가 이제야 풀이 포스팅을 해본다.

 

당시는 거의 이런 대회에 나가본게 처음이라, 시간에 쫒겨서 캡쳐를 제대로 못한 부분이 많다.

 

반응형

 

생각보다 쉬운 난이도의 문제가 많아서,

 

하나씩 포스팅하면 글이 너무 짧아질까봐

 

쉬운 문제들은 몇개씩 묶어서 포스팅 해보려 한다.

 

Simple Cmdshell

 

 

첫번째로 Simple Cmdshell 문제

 

Jail Escape 와 관련된 문제이다.

 

바이너리 파일이 하나 주어지고, 

 

nc를 이용해 접속할 수 있는 주소가 하나 주어진다.

 

바이너리 파일을 IDA 라는 디스어셈블러를 이용해 열어보면

 

위 사진과 같은 main 함수를 볼 수 있다.

 

__isoc99_scanf("%4096s", haystack);

while ( strstr(haystack, "flag") );
if ( !strstr(haystack, "cat") )
	system(haystack);

 

눈여겨 봐야할 부분은 이 부분이다.

 

scanf 를 이용해 사용자의 입력을 받아서 haystack 변수에 저장하고 있다.

 

 

그다음 strstr 함수를 사용하는데

 

strstar(s1, s2) 라고 쓰면 s1 문자열 안에 s2가 포함되어 있는지 찾는 기능을 한다.

 

while 문으로 사용자가 입력한 haystack에 flag 라는 단어가 포함되어있는지 검사하고,

 

있으면 무한 루프가 돌아버린다.

 

flag 가 없다면 if 문으로 들어가게 되고

 

if 문에서는 cat 이라는 단어가 포함되어있는지 검사하고,

 

없다면 system(haystack) 을 실행시킨다.

 

 

nc 명령어로 원격 서버에 접속해보니

 

윈도우 cmd 창이 나왔다.

 

일단 cat 과 flag 를 사용할 수 없도록 필터링을 걸어놨으니 

 

리눅스 명령어를 실행시킬 수 있는 쉘이 있어야 될거 같아서

 

sh 라고 입력해봤더니 쉘이 떨어졌다.

 

id 명령어 수행결과가 밑에 잘 출력되는것이 보인다.

 

 

떨어진 쉘에는 필터가 없으니

 

그냥 cat flag 라고 입력하면 플래그가 출력된다.

 

Simple Patch

 

 

코드 오디팅과 관련된 문제

 

nc로 접속할 수 있는 원격지 주소만 제공된다.

 

접속해보면 위와 같은 안내문이 나온다.

 

아래 코드에서 취약점을 찾아 패치해보라고 한다.

 

#include<stdio.h>
int main()
{
    char buf[248];
    scanf("%360s", buf);
    printf("%s\n", buf);
}

 

주어지는 코드는 위와 같다.

 

딱 봐도 버퍼오버플로우 취약점이 보이는게

 

buf 배열의 크기가 248인데,

 

바로 아래서 scanf 함수로 360 만큼 사용자 입력을 받고 있다.

 

이러면 버퍼를 넘어서 사용자 입력값이 저장될 수 있으므로

 

버퍼오버플로우 취약점이 발생한다.

 

저 부분만 간단하게 수정해주면 된다.

 

 

수정할 line을 알려준다.

 

버퍼의 크기를 늘릴거니 4라고 입력해줬따.

 

그다음 수정된 코드인 char buf[360]; 을 입력해줬다.

 

잠시 기다리면 테스트 과정이 끝나고

 

아래쪽에 플래그가 출력된다.

반응형