오늘은 LOB FC3의 마지막 단계인 evil_wizard를 풀어볼것입니다. 먼저 소스코드 부터 보죠 우리는 bss영역에 system함수의 주소를 strcpy로 붙여넣고, 그 bss주소를 printf@got에 넣을 것입니다. 그러기 위해서 strcpy@plt와 printf@gotbss주소를 알아야합니다. 앞에 두개는 2019/02/23 - [해커스쿨 LOB] - LOB FC3 hell_fire -> evil_wizard 이 글을 통해 구하시면 되고, bss는 이렇게 구해주시면 됩니다. 그런다음 제가 이전 글에서 했던대로 printf@got을 system함수의 주소로 덮어쓰고 printf@plt를 ret로 준 뒤 인자로 /bin/sh를 주면 됩니다. 그래서 공격코드는 from struct import pa..
오늘은 LOB 4단계인 hell_fire를 풀어볼겁니다. 우선 소스부터 보져 흠 GOT overwriting을 써야하군요 GOT에는 실제 함수의 주소들이 저장되어있는데 그것을 덮어씌어서 printf문 대신에 system(/bin/sh) 가 실행되게 만들겁니다. 자 이제 objdump를 이용해 , 를 구하고, 을 gdb를 통해 구해봅시다.그리고 사진에는 안나와있지만 objdump -d ./evil_wizard | grep printf@plt주소 요거를 해주시면 printf@got가 구해집니다. 여기 pop_pop_ret 주소를 구할 때 우리는 pop 2번 + ret만 필요하므로 의 주소를 구해야합니다. 자 이번에는 마지막에 넣을 system()의 주소와 /bin/sh의 주소를 구해봅시다. 이제 system..
이번에는 dark_eyes를 풀어볼거다. 먼저 hell_fire 소스를 보자 여기서 포트는 7777이라는 것과 hint를 볼 수 있는데 hint에 적힌 것보다 훨씬 쉬운 방법이 있으므로 우리는 이 방법으로 풀자우선 system함수의 메모리 주소를 통해 system함수의 명령을 보면 do_system라는 함수를 호출하는 것을 알 수 있다. 그 뒤 do_system 함수의 내부의 명령어들을 보다보면 execve 함수를 실행시키는 부분이 있는데 이 함수를 실행하게끔 하는 주소를 RET에 적으면 /bin/sh를 실행시키는 것과 똑같은 작용이 일어난다. 고로 우리가 RET에 덮어씌울 메모리 주소는 0x750784가 된다. gdb로 hell_fire을 열어서 우리가 얼마나 덮어씌우면 SFP가 나오는지 확인한다. 우..
이번에는 iron_golem을 풀어볼것입니다. 먼저 dark_eyes 프로그램의 소스를 보져 hint를 보면 RET sleding이라고 합니다. RET sleding이란 리턴주소에 RET명령어가 계속 실행하게 해서 ebp의 값을 우리가 원하는 값으로 변조한뒤에 우리가 원하는 함수가 실행되게 하는겁니다. RET sleding 기법으로 ebp 변조를 하게되는 과정은 1. 원래 함수의 leave, RET 실행 (pop 2번 -> esp 4 * 2만큼 상승)2. RET 부분에 RET명령어를 원하는 갯수만큼 씀 3. RET명령은 pop eip, jmp eip로 구성되어있으므로 esp는 RET를 실행할 때마다 4씩 상승4. 우리가 원하는 함수 실행 5. 함수 진입과정에서 push ebp, mov ebp, esp가 ..
이제부터 본격적으로 LOB FC3 풀이에 대해 할것입니다. 먼저 level1의 아이디와 비번은 모두 gate로 동일합니다! 먼저 iron_golem의 소스를 보져 여기서 strcpy 이 부분에서 BOF가 발생하고, 힌트를 보니 fake ebp라 되어있군요 fake ebp는 말 그대로 ebp를 우리가 원하는 값으로 변조 한뒤에 공격을 하는 것입니다. 우리는 여기서 RET에 execl함수 주소를 넣고 execl의 첫번째 인자의 주소 - 8을 한 주소로 ebp를 변조할 것입니다.먼저 ASLR의 적용을 안받는 GOT부분을 보져 주소가 0x8049618인것을 알 수 있습니다. 다음에는 iron_golem 프로그램을 복사한 뒤 그 프로그램을 gdb로 열어보고 저 주소의 값들을 봅시다. 0x0804954c 의 값이 ..
오늘은 LOB FC3에 대해 풀이하기 전에 FC3에 사용된 보호기법에 대해 알아볼 것입니다. 먼저 사용된 풀이 기법은 ASLR, StackDummy, ASCII armor NX가 있습니다. 1. ASLR은 address space layout randomization의 약자로 말 그대로 프로그램을 실행할 때 마다 메모리의 주소가 바뀐다. 2. Stack Dummy는 말그대로 스택의 값들 사이에 Dummy(쓰레기 값)가 있다. 예를 들면 256바이트 크기의 변수를 선언하는데 300바이트만큼 ebp에서 빼주는 것이다. 3. ASCII armor는 공유라이브러리의 메모리 주소가 0x00으로 시작하게 된다. BOF는 주로 문자열 복사 함수에서 나는데 이 ASCII armor로 인해 0x00 널이 넣어지게 되면 ..
해커스쿨 LOB나 FTZ를 풀 때 bash 명령어를 실행 시키는 쉘코드를 사용할 때가 많으실 겁니다. 그런데 putty라는 프로그램을 사용하시는 분들은 긴 쉘코드들을 수작업으로 입력하게 됩니다. 이런 불편함을 없애고 싶은 마음이 들어서 이 프로그램을 개발하게 되었습니다. 이 프로그램은 파이썬으로 개발이 되었며 자세한 코드 내용을 알고 싶은 분들은https://github.com/youngsouk/bash_shell - 여기를 참고해주세요! 웬만한면 xshell 쓰세요ㅠㅠㅠㅠㅠㅠㅠㅠ xshell은 마우스 우클릭으로 복붙가능!xshell알았으면 개고생안했는데ㅠㅠㅠㅠㅠㅠㅠ 사용할 때의 모습