Wargame/pwnable.kr Challenge
-
[Toddler's Bottle] randomWargame/pwnable.kr Challenge 2019. 2. 19. 10:29
→ 힌트는 아래와 같다. → random.c 소스 파일이다. → 코드를 해석해보면, random 변수에 rand() 함수를 통해 얻은 값과 사용자로부터 입력받은 key 값을 서로 XOR 연산하여 0xdeadbeef 라는 값을 생성하면 flag 값을 볼 수 있는 문제이다. → 여기서 rand() 함수에 주목할 필요가 있다. rand()를 통해 생성되는 난수는 임의로 생성되는 난수이지만 이는 고정적이기 때문에, 다시 난수를 생성해도 고정된 값이 생성된다. 따라서, rand()의 리턴 값을 미리 알아낸다면 random 이라는 난수에 들어갈 값을 알아낼 수 있다. → 다음 난수를 미리 알고 있다면, 미리 입력할 key 값을 xor 연산하여 미리 0xdeadbeef 값으로 맞춘다면 문제는 풀리게 된다. → 리눅스..
-
[Toddler's Bottle] flagWargame/pwnable.kr Challenge 2019. 2. 14. 10:59
→ 힌트는 아래와 같다. → 바이너리 다운로드 및 분석 환경(ubuntu)에 업로드한다. → gdb로 디버깅을 시도하였지만 실행 파일 포맷이 아니라는 메시지를 확인했다. → objdump로 바이너리 파일 포맷 정보를 확인했다. → gdb에서 실행파일로 인식하지 않았으나, objdump에선 elf64 실행 파일로 인식하는 것을 확인할 수 있다. 먼저 실행파일인 점과 64비트 바이너리 인점을 알 수 있다. → strings 도구를 이용하여 바이너리 스트링 값을 확인한다. 일일히 확인하다가 upx라는 패킹 메시지를 확인했다. → 메시지에도 알 수 있듯이 해당 파일은 upx 패킹된 상태로 추측되며, UPX 언팩을 진행해야 한다. unpacker를 아래와 같이 설치한다. → 설치 후 upx 명령어를 입력하면 사용..
-
[Toddler's Bottle] bofWargame/pwnable.kr Challenge 2019. 1. 22. 09:39
→ 문제는 아래와 같다. → 바이너리와 소스파일을 다운로드한 후, 분석 환경(ubuntu)에 업로드하여 확인한다. → 코드를 살펴보면, func 함수의 인자 값은 0xdeadbeef 인데 gets 함수를 통해 사용자 입력 값을 받는다. 이를 통해, 0xdeadbeef 값을 0xcafebabe 값으로 변경하여 쉘을 획득하는 버퍼오버플로우 문제임을 알 수 있다. → gdb 디버깅을 통해 func 함수를 디스어셈블하여 스택 구조를 파악한다. (gdb) disas funcDump of assembler code for function func: 0x0000062c : push ebp 0x0000062d : mov ebp,esp 0x0000062f : sub esp,0x48 0x00000632 : mov eax,..
-
[Toddlers's Bottle] collisionWargame/pwnable.kr Challenge 2019. 1. 17. 19:20
→ 문제는 아래와 같다. → 로그인 후 파일 확인. → col.c 소스코드 확인. → 문제 해결을 위해선, hashcode == check_password(artv[1])의 값이 참으로 만들어야 한다. 이 때, hashcode 값은 0x21DD09EC이고, check_password(argv[1])의 값이랑 비교한다. → check_password 함수를 살펴보면, 인자 값으로 argv[1] 값을 받고 이를 ip 배열로 받아 더하여 리턴한다. → 두번째 분기문에서 strlen(argv[1]) != 20 에 의해 실행 인자 값은 반드시 20바이트이여야 한다. → 결국 20바이트의 passcode 인자 값을 통해 check_password 함수 연산 결과와 0x21DD09EC의 값이 동일하게 만드는 문제이다..