분류 전체보기
-
[L.O.B] Level 20 - xaviusWargame/L.O.B 2022. 11. 14. 00:08
Level 20 - xavius를 풀어보자. 드디어 마지막이다!! 소스 코드를 보면 다음 Level은 음.. 아마 death_knight일 듯 하다. 힌트는 remote BOF라고 되어 있다. 소스 코드가 굉장히 길지만, 필요한 부분만 보도록 하자. 소켓 프로그래밍 코드인데, 버퍼의 크기는 40 바이트이다. 아래 쪽의 recv를 보면 입력을 256 바이트를 받기 때문에 여기서 overflow가 발생한다. 프로그램을 실행시키보면, 이미 시작 중인 것을 알 수 있다. 다시 소스 코드를 보면 6666번 포트를 열고 있는 것이 보이는데, 확인을 해보도록 하자. netstat 명령어로 현재 네트워크 상태를 확인할 수 있는데, local에 6666번 포트가 LISTEN 상태인 것이 보인다. 이번 문제는 힌트에 있듯..
-
[L.O.B] Level 19 - nightmareWargame/L.O.B 2022. 11. 11. 03:34
Level 19 - nightmare를 풀어보자. 소스 코드를 보면 다음 Level은 xavius고, arg라는 힌트가 있다. 이번 Level은 제한 조건이 꽤나 많은 것 같다. RET의 마지막 값에 \xbf, \x08의 사용을 금지해 스택을 건드리지 못하게 되어 있다. 다음으로 RET의 첫 번째 값이 \xc9, 두 번째 값이 \xc3인 것을 금하면서 라이브러리의 사용을 막는다고 한다. 그리고 stack destroyer를 통해 버퍼와 SFP를 초기화하고, RET 뒤의 스택을 초기화한다. 그렇다면 이 문제는 어떻게 푸는 것일까?? 이 Level은 한 가지 특이점이 있다. 소스 코드의 상단 부분을 보면 argv의 값을 buffer에 넣는 것이 아닌 fgets 함수를 통해 buffer를 채운다. 이번에는 이..
-
[L.O.B] Level 18 - succubusWargame/L.O.B 2022. 11. 10. 06:52
Level 18 - succubus를 풀어보자. 소스 코드를 보면 다음 Level은 nightmare이고, PLT라는 힌트가 있다. 제약 조건은 check address와 dangerous waterfall이 있다. check address로 인해 strcpy 함수의 주소를 argv[1]의 44번째 값부터 넣어주어야 한다. dangerous waterfall은 buffer의 48번째 값부터 4 바이트를 'A'로 만든다. gdb를 통해 더미 값과 특별한 동작이 있는지 확인해보자. 더미 값은 없고, 눈에 띄는 특별한 동작도 없는 것 같다. 이 Level은 어떻게 해결해야 할까? 힌트에 있는 내용인 PLT에 대해 알아보도록 하자. [PLT] 더보기 PLT는 GOT와 함께 쓰이는 용어이다. 먼저 PLT는 Pro..
-
[L.O.B] Level 17 - zombie_assassinWargame/L.O.B 2022. 11. 10. 04:22
Level 17 - zombie_assassin을 풀어보자. 소스 코드를 보면 다음 Level은 succubus고, calling functions continuously라는 힌트가 있다. 우선 함수들이 선언되어 있는데, 이름이 도, 개, 걸, 윷, 모인 것 같다. main 함수에는 라이브러리 금지, 주소 체크, 스택 초기화의 조건이 있다. 그런데, 이 Level은 쉽게 해결할 수가 있다. 함수의 에필로그 과정을 이용하여 힌트처럼 함수가 연속적으로 실행이 되도록 하면 된다. (각 함수의 RET에 다음 함수의 주소를 넣어 함수의 에필로그 과정에 의해 다음 함수가 실행되도록 한다.) 각 함수의 check 값과 if 문을 보면 도, 개, 걸, 윷, 모의 순서로 함수를 불러오면 된다. 우선 각 함수의 주소를 알..
-
[L.O.B] Level 16 - assassinWargame/L.O.B 2022. 11. 6. 08:19
Level 16 - assassin을 풀어보자. 새로운 공격 기법이 나타났다!! 소스 코드를 보면 다음 Level은 zombie_assassin이고, FEBP라는 힌트가 있다. 이번 Level의 제약 조건은 앞과 비슷하지만, 마지막에 strncpy 함수를 사용해 정확한 갯수를 복사한다. gdb 분석을 통해 간단하게 dummy 값 정도를 확인한다. dummy 값은 없고, 문제를 어떻게 풀 지를 생각해보자. 소스 코드에 FEBP라는 힌트가 있다. 이번 Level은 FEBP를 활용하여 풀어보도록 하자. [FEBP] 더보기 FEBP란 Fake-EBP를 의미한다. 문자 그대로, EBP를 조작해 원하는 코드를 실행할 수 있도록 하는 공격 기법이다. 이 공격 기법은 함수의 에필로그 과정에서 (leave-ret) ga..
-
[L.O.B] Level 15 - giantWargame/L.O.B 2022. 11. 6. 03:54
Level 15 - giant를 풀어보자. 새로운 공격 기법이 나타났다!! 소스 코드를 보면 다음 Level은 assassin이고, no stack, no RTL이라는 힌트가 있다. RTL을 앞에서 해봤으니 쓰지 마라고 하는걸까..?? 아무튼 코드 하단을 보면 argv[1]의 48번째 값에 \xbf와 \x40을 사용하지 못하게 되어 있다. 그리고 buffer와 sfp를 합한 44 바이트를 0으로 초기화한다. gdb로 assassin 파일을 분석해보자. dummy 값은 없고, 앞의 Level들처럼 특별한 내용도 없는 것 같다. 그렇다면 공격은 어떻게 해야 할까?? 이번 Level에서 시도해 볼 공격은 RET Sled라고 불리는 공격 기법이다. [RET Sled] 더보기 RET Sled는 간단하게 설명하자면..
-
[L.O.B] Level 14 - bugbearWargame/L.O.B 2022. 11. 5. 07:26
Level 14 - bugbear를 풀어보자. 소스 코드를 보면 다음 Level은 giant이고, RTL2라는 힌트가 있다. 앞의 Level과 마찬가지로 RTL 공격 기법을 이용해 문제를 풀 수 있는 것 같다. 소스 코드는 복잡해 보이지만, 의미들이 주석으로 설명이 되어 있다. 변수들을 선언하고, 프로그램 실행 시 입력할 인자 갯수에 대한 조건이 걸려 있다. 다음으로 execve 함수의 주소를 알아내는 명령어가 있다. 중요한 것은 libc 주소 + 함수 offset으로 라이브러리에 있는 함수의 주소를 알 수 있다는 것이다!! 그 다음, ret에 execve 함수의 주소를 넣어주어야 정상적으로 동작한다는 것을 나타낸다. 마지막으로 argv[1]을 buffer에 복사해 넣고, buffer를 출력하면서 프로그..
-
[L.O.B] Level 13 - darkknightWargame/L.O.B 2022. 11. 4. 01:48
Level 13 - darkknight를 풀어보자. 새로운 공격 기법이 나타났다!! 소스 코드를 보면 다음 Level은 bugbear이고, RTL1이라는 힌트가 있다. 제약 조건은 간단하다. argv[1]의 48번째 값이 \xbf가 아니면 된다. RTL1이라는 힌트가 있으니, 이것을 이용해 공격을 시도해보자. 우선, gdb 분석을 통해 스택에 어떻게 입력이 되는지 확인을 한다. RTL은 Return-To-Libc의 약자이다. 이 공격 기법은 앞으로도 중요한 공격 기법이기 때문에 정리를 해보도록 하자. [RTL 공격] 더보기 RTL은 스택에 NX-bit 보안 기법이 적용되어 있을 때 사용하는 공격 기법이다. NX는 Never eXecute stack을 의미하는 것으로, 스택에서 코드를 실행할 수 없게 하는..