본문 바로가기

포너블/워게임_LOB

(8)
LOB 문제풀기( Xavius => death_knight) 이문제는... 이 문제는 아예 감을 못잡아서 전부 https://grayfieldbox.tistory.com/entry/LOBLord-Of-BufferOverflow-xavius-deathknight [L.O.B.(Lord Of BufferOverflow)] xavius -> death_knight death_knight의 소스를 확인하도록 하겠습니다. 이코드는 port를 6666으로 설정하고 256byte의 입력을 받아 buffer에 저장합니다. Buffer의 크기가 40byte이므로 overflow가 발생하죠. L.O.B.서버의 6666포트로.. grayfieldbox.tistory.com https://d4m0n.tistory.com/94 [LOB] xavius -> death_knight 드디어 LOB의 마지막..
LOB 문제풀기(Nightmare => Xavius) 제일 먼저 파일을 확인해보자!! 이 코드를 해석해보면 일단 스택 영역에 쉘코드를 삽입이 불가능한것을 알수있고, leave 와 ret 명령어를 return 주소에 넣지 못하며 라이브러리를 사용하지못한다. 더욱이 ld 환경변수를 등록해서 사용해도 초기화되서 의미가 없다. 하지만 여기서 기존의 코드랑 다른점이 strcpy가 아니라 fgets 함수를 argv가 아니라 stdin을 이용해 복사를 실시하는 것 같다. 하지만 fgets함수와 stdin을 잘모른다.... 그래서 검색의 힘을 통해 찾아보았다. stdin 의 의미를 찾아본 결과 표준 입력에 대한 포인터로서 이곳에서 입력 버퍼를 가지고 있다. 또한 이부분을 공략해야된다고 들었다. 한번확인해보자 일단 stdin의 값은 fgets 함수의 마지막 인자로서 이용하..
LOB 문제풀기(Succubus => Nightmare ) 먼저 파일을 확인한해본다. 소스를 해석해보면 버퍼크기는 40이고, argc는 2 이상이어야하고, ret 주소가 strcpy주소와 일치해야하는 것 같다. 또한 버퍼를 argv[1]의 값을 복사하고, memset함수로 버퍼 48 위치부터 4byte를 A로 지정해준다. 여기서 우리는 strcpy 함수를 main 함수릐 ret을 이용해 호출하는데, 이때 strcpy 함수의 ret주소는 dummy로 막혀있어 rtl chainning 을 이용하지 못한다. 하지만 char *strcpy 함수의 형태는 ( char *destination, const char *source ); 로 destination 에 strcpy ret 주소를, source에 쉘코드를 포함한 환경변수의 주소가 있는 주소를 넣어 익스플로잇 공격을 ..
LOB 문제풀기(Assassin => Zombie_Assassin) 가장 먼저 파일들을 살펴본다. 다음 zombie_assassin.c 의 코드를 살펴보면 버퍼크기는 40이고, 핵심은 argv[1][47] 의 값은 \xbf가 되서는 안되며 \x40의 값을 가져서도 안된다. 즉 리턴할 주소가 스택안의 주소에서 발생해서는 안되고, 라이브러리 함수를 이용해 익스플로잇 공격을 할수도 없다. 하지만 코드위에 FEBP 즉 fake ebp 공격을 하라고 알려준다. 이 공격은 sfp를 변조시켜 공격하는 것으로 FPO 공격과 비슷하지만 큰차이는 서브함수가 필요없이 return 할 주소로서 다시 leave-ret을 실시하도록 하여 exploit을 실행하도록 하는 공격방법이다. 페이로드를 구상해보면 4byte(&buffer+4) + 24byte(shellcode) + 12byte(null)..
LOB 문제풀기(Giant => Assassin) 다음명령어를 통해 가장먼저 assassin.c 파일의 코드를 알아본다. 이 코드를 해석하면 argc의 수는 2이상이여야 하며, argv[1][47]은 \xbf가 되면 안된다. 그러면 RTL을 쓰면 되는 건가? 근데 그것도 아니다... argv[1][47] 은 \x40 이 되서도 안된다. 그러므로 RTL을 쓰는 것도 아닌것 같다. 더구나 버퍼를 44크기까지 모두 0으로 설정까지 한다. ret명령어는 pop eip, jmp eip 를 의미하는데, 리턴주소에다 ret을 한번 더 실행시키는 명령어의 주소를 입력하게 된다면 ret 바로 뒤에 있는 주소가 리턴 주소의 역할로 하게된다. 이것을 RET sled 공격기법이라고 한다. GDB를 통해서 ret 명령어의 주소를 알아낸다. ret 명령어의 주소는 0x80483..
LOB 문제풀기(Bugbear => Giants) 젤 먼저 giant.c 파일의 코드를 본다. 이 코드의 핵심은 ret 주소에다 execve 함수의 주소를 입력해야한다는 것을 알수가 있다. 그러면 execve의 세개의 인자가 필요한다. 이를 통해 페이로드는 40byte(esp)+4byte(sfp)+4byte(ret=execve)+4byte(dummy)+4byte("/bin/sh")+4byte(argv[0])+null 형태로 입력이 가능한데, 이때 main함수의 ret은 execve이고, execve함수가 실행됨에 따라 execve가 ebp역할을 하게되어 dummy가 execve의 ret이 된다. dummy에 system함수를 입력하고 그다음은 exit함수를 넣어 execve함수의 인자로서 execve함수를 종료시켜 system 함수가 작동하도록 한다. ..
LOB 문제풀기(Darkknight => Bugbear ) 제일 먼저 ls 명령어를 통해 파일을 본다. bugbear.c 파일을 cat 명령어로 살펴본다. 다음처럼 argc는 2 이상이어야 하고 버퍼크기는 40이며, argv[1][47]=\xbf가 되서는 안된다. 그말은 지금 내가 알고 있는 지식으로는 페이로드안이나 스택안에서 쉘코드를 실행시킬수 없다. 그러므로 RTL 기법을 이용한다. 페이로드를 작성하면 40크기(BUFFER) + 4크기(SFP) + 4크기(SYSTEM 함수 주소) + 4크기(DUMMY) + 4크기("/bin/sh" 인자의 주소) 먼저 gdb를 이용해 system 함수의 주소를 알아내자!! 다음처럼 (1) 브레이크포인트를 걸어준다. (2) run을 실행해준다. (3) print system을 통해 system 함수의 주소를 구한다. system..
LOB 문제풀기(Golem => Darkknight) 이제 문제를 풀어보자 다음과 같이 bash2로 바꿔주고 파일을 확인하는 기본과정을 겪는다. cat 명령어로 darkknight.c 파일의 코드를 살펴보면 다음 조건은 argc의 값은 2이상이어야 프로그램 종료를 막을수 있고, problem_child(argv[1])를 호출 하면서 40크기의 버퍼가 argv[1]를 41크기까지만 복사하여 버퍼오버플로우를 막는 코드인거 같다. 위의 활동을 통해 버퍼의 시작이 되는 주소가 bffffc84임을 알수 있었고, 다음 core 파일의 분석을 통해 실제 ebp-8의 주소가 밀려 bffffc6c임을 알수가 잇다. 패스워드는 new attacker 이다.