본문 바로가기

ctf

[CodeGate 2015 CTF] bookstore # bookstore: ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, BuildID[sha1]=5b70a1f426ece14edd78f5a3fc006910d5eeb556, stripped 파일 명령을 통해 보면 해당 바이너리는 32bit 환경에서 돌아가는 바이너리이다. 보호 기법으로는 NX, Canary, PIE 가 걸린 것을 확인할 수 있다. 해당 바이너리는 도서 관리 프로그램으로, 구조체를 사용하여 도서 정보를 관리하고 있다. 처음 바이너리를 실행하게 되면 계정과 비밀번호를 묻는다. 이 때 계정과 비밀번호는 "helloadmin", .. 더보기
[CodeGate 2015 CTF] systemshock setuid 가 걸려있는 64bit ELF 바이너리이다. 소스코드를 간단히 분석해보면,가장 먼저, sub_40075c() 함수로 진입하여 환경변수 영역을 초기화 한다. 그 후 argv[1] 의 값이 있는지 확인한 후, 값이 존재한다면 strcat() 함수를 사용하여 argv[1] 의 값을 &command 에 넣게 되는데 여기서 크기 검증을 하지 않기에 stack overflow가 발생한다. 그 후 __ctype_b_loc 함수를 통해 특수문자 검사를 하고, 특수문자가 존재하지 않는다면 system() 함수를 통해 어떤 명령을 실행시킬 수 있다. ASLR, NX 가 걸려있고, Canary 또한 존재한다. for 문을 확인해보면, strlen(argv[1])을 구해서 특수문자를 검사하게 되는데 argv[1].. 더보기
[CodeGate 2015 CTF] yocto 코드를 대충 분석해보면.. read 함수를 통해 변수명 glob로 선언된 .bss 영역에 80byte 만큼 입력을 받는다. 그리고 shutdown 함수를 사용하여 소켓의 파일 디스크립터 0, 1, 2 모두 종료한다. 그리고는 문자 정수 변환 과정을 거치며, 두 번째 "." 문자열 뒤의 값으로 점프한다. shtudown 함수로 인해 memory leak 을 이용하여 라이브러리 주소를 가져올 수 없다... 어떻게 해야할까...? 먼저 우리가 알고 있는 것은, [!] Dynamic Linking 방식을 사용하고 있다. [!] Full-RELRO 가 아니다. [!] 만약 payload 를 넣었을 때, payload가 있는 곳의 주소를 알 수 있다. => .bss 영역 [!] eip 를 조작할 수 있다. 위의 조.. 더보기
[CodeGate 2014 CTF] 4stone file 명령을 통해 ELF 32bit 바이너리인 것을 확인할 수 있다. 실행을 하면 다음과 같이 4목 두는 게임이 실행된다. 로컬에서 바로 실행할 수 있다. ida를 통해 바이너리를 열어보니 ncurses로 만들어진 프로그램인 것을 확인할 수 있었다.우선 코드를 살펴보면, 4목에서 이길 경우 몇 초만에 이겼는지 출력한다. 만약 0초 일 경우 입력을 받고, 0x8040000, 0xB0000000 주소를 필터링한 다음 필터링을 통과하면 임의의 메모리 주소에 4byte 데이터를 쓸 수 있게된다. 위에서 필터링하고 있는 주소는 바이너리 주소와 스택 영역의 주소로 그 외의 다른 영역을 써야 한다. ulmit -s unlimited 명령을 통해 라이브러리 주소를 고정할 수 있다.(로컬에서만!) 따로 방어기법이 적.. 더보기
[CodeGate 2014 CTF] dodoCrackme file 명령을 통해 64bit 리눅스 환경의 바이너리임을 알 수 있다. IDA를 통해 Import, String 등 정보를 얻기 위해 확인해보았지만 깔끔히 비어있다... 실행시키면 다음과 같이 password를 입력받는다. 임의의 password 를 입력하니 "Permission denied (password)." 문자열을 출력한다. IDA를 통해 debugging을 하다보면, 키 값이 생성된다는 것을 알 수 있다. 맨 처음 풀 때는 노가다를 해서 메모리에 키 값을 찾아냈다. 좀 더 빨리 풀기위해 시도하다 password를 입력받는 곳에서 브레이포인트를 설정한다면 메모리에 키 값이 생성되있는 것을 확인할 수 있다. 바이너리 코드를 보면 이러한 키 값을 입력받기 위해 syscall 을 사용한 것을 알 수.. 더보기
[Plaid 2013 CTF] pork 취약점이 발생하는 함수는 clienterror 함수로, sprintf 함수에서 overflow가 발생한다. 좀 더 자세히 설명하자면, 위 그림에서 0x800 만큼 입력받는 것을 볼 수 있다. 그렇다면 총 2048byte인데 clienterror 함수에서 크기가 0x400 크기를 가지고 있는 s 변수에 덮어씌우기 때문에 overflow 가 된다. ※ 주의해야하는 점은 입력받은 변수를 sscanf로 입력하기 때문에 payload 안에 종료를 의미하는 "\x00, \x2f" 와 같은 문자열이 들어가게 되면 페이로드가 짤리게 된다. s 변수에서 ebp 까지의 거리는 1112byte(0x458) 이다. 하지만 우리가 입력한 것들이 s 에 들어가기 전에 에러 문자열을 s 에 먼저 넣고 있기 때문에 1112byte .. 더보기
[CodeGate 2014 CTF] nuclear buf 의 크기는 512byte 이지만 recv 함수를 통해 1298byte 만큼 입력받아 overflow 취약점이 존재한다. 해당 취약점이 존재하는 함수로 이동하기 위해 passcode 를 알아내야 한다. passcode v4, v5를 널바이트 없이 연결해주면 passcode가 나온다. __iso99_sscanf(&buf, "%f/%f", v5, v4); 를 이용하면 passcode를 leak 할 수 있다. - - - - - - - - - - - - - - - - - - - - passcode_leak.py - - - - - - - - - - - - - - - - - - - - - from socket imort * from struct import * import time s = socket(AF_I.. 더보기
[CodeGate 2013 CTF] vuln200 &dest 의 크기는 200byte 이지만 recv_buffer 에서 400byte 만큼 입력받을 수 있기에 오버플로우 취약점이 존재한다. NX, PIE, ASLR 등 어떠한 방어 기법도 적용되어 있지 않기에 간단하게 문제를 풀 수 있다. - - - - - - - - - - - - - - - - - - - - - - exploit.py - - - - - - - - - - - - - - - - - - - - - - - - from socket import * from struct import * s = socket(AF_INET, SOCK_STREAM) s.connect(('192.168.127.140', 7777)) p = lambda x: pack(" 더보기
[CodeGate 2014 CTF] AngryDoraemon 취약점이 발생하는 부분이다. write(fd, "Are you sure? (y/n) ", 0x14u); 바로 밑의 read 함수에서 오버플로우 취약점이 존재한다. 그리고 read 함수에서 입력받은 첫 번째 바이트가 'y' 일 경우 You choose '%s' ! 가 출력된다. PIE 는 걸려있지 않지만, NX 와 Canary 값이 존재하는 것을 볼 수 있다. 이 프로그램의 경우 fork를 사용하기에 Canary 값이 랜덤하지 않다. Canary 값은 sprintf(s, "You choose '%s' !\n", &buf) 부분을 이용하여 릭 할 수 있다. sprintf 는 0x00 을 만날때까지 출력해주는데 이 때 Canary 값의 첫 바이트는 0x00 이다. Canary 값의 첫 바이트를 다른 값으로 덮.. 더보기
[Plaid 2013 CTF] ropasaurusrex 바이너리는 매우 간단하다. 실행을 하면 입력을 받은 후 "WIN" 문자열을 출력한 뒤 종료한다. # file ropasaurusrexropasaurusrex: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.18, BuildID[sha1]=0xac7a99968978eed656c19db9209d3cd89280b55e, strippedfile 명령을 통해 32bit ELF 구조의 파일인 것을 알 수 있다. 바이너리를 분석을 통해 위의 코드에서 취약점이 발생하는 것을 알 수 있다.변수 buf 의 크기를 0x88 만큼 선언했지만, read 함수는 0x100.. 더보기