본문 바로가기

WARGAME/hack ctf

(14)
Gift 문제는 다음과 같다. 바이너리를 다운로드하고 실행해보면, 어떠한 주 솟값을 2개 보여주고, 입력을 총 두 번 받는데 첫 번째로 입력받은 문자열은 그대로 출력해주고 두 번째 입력 이후 프로그램이 그냥 종료됨을 알 수 있다. IDA로 보면, 보니깐 저 두 개의 주소들은 system 함수와 binsh 임을 확인할 수 있다. 실제로 system 함수는 바이너리 내부에 있었고 다음으로 binsh를 보니깐 bss 주소로 이어짐을 알 수 있었다. 그러나 실제로 '/bin/sh'가 들어 있는 것은 아니었다. 실제로 gdb로 봐도 요렇게 나와 있당 즉 우리는 실제 저 주소에 '/bin/sh'를 넣어주고 system 함수를 /bin/sh를 넣은 저 bss 주소로 인자를 넣어 주면 될 것이다. 익스는 다음과 같다. 1 2 ..
Look at me 문제는 다음과 같다 다운받아서 실행해보면, 문자열을 한 줄 간단하게 입력 받는다. 본격적으로 분석해보기 전에 file 명령어로 간단한 바이너리 정보를 보았더니 32bit 바이너리 이면서 statically linked 방식임을 확인할 수 있다. 이어서 checksec으로 바이너리에 걸린 보호 기법들을 확인해 보면, NX가 걸려 있음을 확인 할 수 있다. 먼저 NX가 걸려 있으므로 쉘코드는 못 사용할 거고, statically linked 방식이라 libc에 있는 함수들도 못하용하고 오직 바이너리 내부에 있는 함수들만 사용할 수 있다. ida로 쓸만한 함수를 찾아보다가 mprotect라는 함수를 발견했다. 요 함수는 특정 메모리 영역에 권한을 주는 함수이다. 즉 우리는 이 함수를 사용하여 메모리의 적당한 ..
Random Key 이번 문제는 다음과 같다. 먼저 실행을 시켜 보면, 인증 프로그램 컨셉으로 입력을 받게 된다. 그 후 "Nah..."이라는 문자열이 출력이 되고 종료가 된다. 바로 ida로 분석을 해보면, v5 변수에 rand 함수로 난수값을 넣고 입력으로 받은 v4 랑 비교하여 같을 경우 system 함수가 호출된 다. 여기서 우리는 srand가 time 함수를 통해 seed 값을 얻어오는 방식을 역 이용할 수 있다. 원래 rand 함수로 얻어오는 랜덤 값은 몇 번을 실행 하든 동일 하지만 srand와 time 함수로 매 시간마다 다른 seed 값을 받아와 매번 실행할 때마다 다른 랜덤 값이 나온다. 즉, 똑같은 타이밍에 얻어오는 seed 값으로 random 값을 생성하면, 똑같은 값이 나올 것이다. 우선 다음과 같이..
1996 이번 문제는 다음과 같다. 바이너리를 다운로드하고 실행시켜 보면, 다음과 같이 "Which environment variable do you want to read?" 문자열이 뜨고 입력을 받게 돼 있다. 그 후 "입력 한 문자열"=root라는 문자열이 출력이 된다. ida로 분석해 보면, 다음과 같이 C++ 바이너리임을 알 수 있다. 코드를 보면 맨 처음 프로그램을 실행 했을때 나오는 문자열을 출력하고, cin 으로 name에 입력을 받는 것을 알 수 있다. 그리고 이후 "입력한 문자열"=root를 출력하는 것을 알 수 있다. 그냥 쉬운 bof 문제 같은데 다른 함수 목록들을 보면, spawn_shell이라는 함수가 있다. 해당 함수를 보면, /bin/bash를 실행 시키는 함수 임을 알 수 있다. 아..
Poet 이번 문제는 Poet이다. 바이너리를 다운로드하여 실행시켜 보면, 입력을 두 번 받는 것을 볼 수 있다. 첫 번째 입력에서는 시를 쓰라고 하고 두 번째 입력에서는 저자를 맞추라고 한다. 그냥 아무거나 입력받으면 " 점수 :0 "이라고 뜨면서 1,000,000을 모으라고 한다. 해당 바이너리를 ida로 보면, 처음 puts로 문자열 띄워 주고 while(1) 무한 루프 돌리면서 3개의 함수를 호출 하는 것을 확일 할 수 있다. 그리고 if 문에서 dword_6024E0 이 0xF4240( 1000000 ) 이면 무한 루프에서 벗어나고 reward 라는 함수가 호출됨을 확인할 수 있다. 각 함수들을 보면, 먼저 get_poem 함수는 크게 gets로 입력을 받고 dword_6024E0 을 0으로 초기화하는 ..
RTL_World 이번 문제는 RTL_World이다. 바이너리를 다운로드하여 실행시켜 보면, 약간 게임 컨셉의 느낌의 바이너리이다. 2) Make Money로 돈을 모아서 System 함수 주소와 /bin/sh 주소를 사서 구한 다음 익스를 하는 방식으로 짜야 할거 같은데 우선 1번부터 눌러보면, 그냥 checksec 한 거랑 똑같이 나온다. 해당 바이너리는 32bit 면서 nx가 걸려 있음을 확인할 수 있다. 다음으로 2번을 눌러보면, 3가지 방법 중 하나를 선택해서 돈을 벌라는 거 같은데 먼저 1번을 눌러보면 100 Gold 가 들어옴을 확인할 수 있다. 다음으로 2번을 눌러보면, 이번에는 350 Gold 가 들어옴을 확인 할 수 있다. 마지막으로 3번도 눌러보면, 이번에는 500 Gold 가 들어온다. 그리고 돈을 ..
BOF_PIE 이번 문제는 BOF_PIE이다. 바이너리를 다운로드한 다음 실행시켜 보면, "Hello, Do you know j0n9hyun?" 라는 문자열과 "j0n9hyun is (주소)"가 출력 된당 그리고 입력을 한 줄 받게 되는데 그냥 aaa 입력하면 "Nah..."이라는 문자열과 함께 프로그램이 종료된다. 참고로 저기 주소 값은 실행할 때마다 바뀐다. 맨 뒤 909 만 계속 그대로고 앞에 주소는 계속 바뀌는 것을 확인 할 수 있는데 이는 PIE 기법이 걸려서 주소 값이 계속 랜덤 하게 바뀌기 때문이다. checksec으로 확인해 보면, PIE 가 걸려 있음을 확인 할 수 있다. 이제 본격적으로 바이너리를 main 함수부터 보면, 메인 함수 처음 부터 welcome 함수를 호출하는 것을 볼 수 있다. welc..
Offset 이번 문제는 Offset이라는 문제이다. 바로 ida를 통해 분석해 보면 puts로 문자열 하나 띄워준다음 gets로 입력을 받는다. 그다음 입력받은 문자열을 인자로 select_func라는 함수를 호출하는데 해당 함수를 보면. v3 함수 포인터 변수가 'two'라는 함수를 가리키고 있고, strncpy 함수로 dest 라는 변수에 인자로 보내진 src를 0x1f 만큼 복사를 한다. 그리고 dest가 one이라는 문자렬이면 v3은 one을 가리키게 되고, 이후 if 문을 벗어나 v3을 호출한다. 여기서 나온 one과 two 함수를 살펴보면, one이라는 함수는 다음과 같이 생겼고, two 함수는 다음과 같이 생겼다. 그리고 하나 더 'print_flag'라는 함수가 있는데, flag.txt 파일을 출력해..