본문 바로가기
반응형

Security/Pwnable70

FTZ Level 14 Level14에 들어가서 파일들과 hint를 봅니다. 코드를 해석하면 이번 문제는 쉬운 문제인 것 같습니다. check의 위치를 찾아서 check값이 deadbeat가 되면 자동으로 15레벨의 쉘을 띄어줍니다. 프로그램 가지고 메모리 구조를 생각해 보면 RET4 SFP4 dummy? int crap4 dummy? int check4 dummy? buf20 이렇게 됩니다. main+3을 보면 총 56byte가 할당되는 것을 확인 할 수 있습니다. 그렇다면 20Byte(Buf) + Dummy + 4byte(Check) + Dummy + 4byte(crap) + Dummy = 56Byte 가 되는 것입니다. 여기서 Buf와 Check사이의 거리를 알아내어 Check에 deadbeef값을 넣어주면 됩니다. 이때.. 2021. 8. 9.
FTZ Level 13 Level 13에 접속하여 파일과 힌트를 봅니다. 이번에도 attackme를 이용하는 것입니다. 소스를 보면 long형 변수 1개와 char형 배열 하나가 선언되어있습니다. 그리고 long I 의 값이 변하면 프로그램이 꺼집니다. 그러므로 I의 초기값을 유지해야합니다. 소스만 보고 스택구조를 보면 RET4 SFP4 DUMMY? I4 DUMMY? BUF1024 형태가 됩니다. 이를 gdb로 뜯어보면 main+3을 보면 (0x418) 1048바이트가 할당된 것을 볼 수 있습니다. 그렇다면 BUF(1024byte) + DUMMY(?) + I (4byte) + DUBBY = 1048Byte 입니다. 더미의 합은 20 byte가 되어야합니다. 4 + 16, 8 + 12, 12 + 8, 16+ 4 중 하나가 됩니다.. 2021. 8. 9.
FTZ Level 12 Level 12에 접속하여 파일들을보면 Level 11과 똑같다 hint파일을 보면 11과 같이 256바이트를 할당한 변수를 생성하고 있다. 다른점은 strcpy함수가 아닌 gets함수를 사용한다는 것이다. gdb로 뜯어보면 구조는 Level11과 같다 RET4byte SFP4byte DUMMY8byte STACK256byte 그래서 Level11과 똑같이 풀었는데 안된다 ㅋㅋㅋㅋㅋㅋ 가만 생각해보니 gets 함수라서 그렇다. "|"와 cat을 사용하여 값을 넘겨주면 해결된다. (eggshell과 getenv 사용) (python -c 'print "A"*268+"\xbc\xf2\xff\xbf"';cat)|./attackme 그럼 Level 13의 권한을 획득한다. 2021. 8. 9.
FTZ Level 11 Level 11부터는 어느 정도 공부가 필요한 것 같아서 달고나 BOF문서를 공부하고 풀었습니다. 우선 Level11에 접속하여 hint를 보면 256바이트의 배열이 생성되는 것과 strcpy함수를 볼수 있습니다. 이 프로그램을 gdb로 뜯어보면 main+3 에서 0x108만큼 할당을 하는 것을 볼 수 있습니다. 그리고 main+48에서 strcpy를 호출하고 있구요 (취약점 발생부분) 그럼 main+53에 break를 걸어줍니다. 여기서 메모리 구조를 보면 ret4byte SFP4byte dummy8byte stack256byte 로서 총 272바이트가 됩니다. 그렇다면 NOP + 쉘코드 (268byte) + RET (4byte) 형태가 되어야 겠지요. 그런데.... 안되네요. setUID 문제라고 하.. 2021. 8. 9.
Buffer Overflow 원리 - 공격-1 고전적인 방법 Buffer Overflow 공격 아래 코드의 프로그램을 사용할 것이다. 소스코드를 보면 실행 시 주어지는 첫 번째 인자를 buffer라는 char형 배열에 복사한다. 또한, bound check를 하지 않는 strcpy()함수를 이용하고 있다. 그렇다면 아마도 이 프로그램은 1024바이트의 버퍼 공간에 쉘 코드와 NOP로 채우고 4바이트는 main함수의 BP이므로 역시 NOP으로 채우고 다음 만나는 4바이트가 return address이므로 이곳에 쉘코드가 있는 곳의 address를 넣어주면 쉘코드를 실행시킬 수 있을 것이다. 그렇다면 이 쉘 코드가 있는 곳의 address찾는 것이 가장 큰 문제가 된다. 고전적인 방법 가장 고전적인 방법으로는 추측하는 것이다. 몇 번의 시행착오를 거치면서 쉘이 떨어질.. 2021. 8. 8.
Buffer Overflow 원리 - 쉘코드 쉘 코드 만들기 쉘코드를 만들어보자. 쉘 코드란 쉘(shell)을 실행시키는 코드이다. 쉘은 흔히 명령 해석기라고 불리는데 일종의 유저 인터페이스라고 보면 된다. 사용자의 키보드 입력을 받아서 실행파일을 실행시키거나 커널에 어떠한 명령을 내릴 수 있는 대화통로이다. 쉘 코드는 바이너리 형태의 기계어 코드이다. 우리는 쉘 코드를 만들어야 하는 이유는 실행중인 프로세스에게 어떠한 동작을 하도록 코드를 넣어 그 실행 흐름을 조작 할 것이기 때문에 역시 실행 가능한 상태의 명령어를 만들어야 하기 때문이다. 만약 공격자가 기계어 코드에 능통하다면 직접 기계어 코드를 작성해도 좋을 것이다. 하지만 지금은 CPU instruction의 종류가 늘어났고 너컬이 복잡해져서 아주 힘든 작업이다. 그래서 C를 이용하여 간단.. 2021. 8. 6.
반응형