먼저 코드를 봅시다 ! egghunter 부분으로 환경변수에 쉘코드를 넣어 실행시키는게 불가능 합니다. argv 갯수 제한이 없으므로 argv[2]에 NOP + shellcode 넣고 ret를 argv[2]주소로 돌리면 될거같습니다. NOP를 넣는 이유 : shellcode를 넣는다 하더라도 정확한 주소를 맞출수가 거의 없습니다. 따라서 NOP을 앞에 넣어주므로 우리가 만약 shellcode의 주소를 정확히 못맞추더라도 NOP을 타고 내려가서 shellcode를 실행 시킬수 있기 떄문에 shellcode 실행 확률을 높혀 줍니다. argv[2] 주소를 알기위해 소스코드를 수정할 겁니다. 수정을 위해 하나 복사해 주고, exp.c 마지막줄에 추가해 줍시다 . 공격을 argv [1] : dummy [40 b..
이제 다풀었으니 밀렸던 포스팅을 천천히,,,
먼저 goblin.c 코드를 봅시다 Level2 문제와 buffer 크기는 같지만 문자열을 입력 받는 형식이 argv에서 buffer로 값을 전달하는 strcpy 에서 gets 함수로 바뀌게 되었습니다. 이런 경우에는 (python -c 'print "~~~~"';cat) | ./goblin 식으로 파이프로 연결하여 실행시켜주면 값이 들어가게 됩니다. 공격코드는 Level 2와 동일하지만 파이프 연결식으로 조금 고치면 됩니다. (python -c 'print "A"*16 + "ABCD" + "\xe0\x8a\x05\x40" + "ABCD"+"\xf9\xbf\x0f\x40"';cat) | ./goblin [buffer] [sfp] [system] [dummy] [shellcode] [pipe] 클리어
먼저 cobolt.c 코드를 봅시다 뭐야... 저번문제에서 buffer 크기만 달라졌습니다. 똑같은 RTL 방식으로 풀고 system 함수 주소, shell 주소 찾는 부분은 생략하겠습니다. ./cobolt `python -c 'print "A"*16 + "ABCD" + "\xe0\x8a\x05\x40" + "ABCD"+"\xf9\xbf\x0f\x40"'`[buffer] [sfp] [system] [dummy] [shellcode] 클리어
먼저 gremlin.c 코드를 봅시다! 이렇게 되어있습니다. RTL 기법을 이용하여 공격 할것이고 계획을 짜보자면buffer(256 byte) + sfp(4 byte) + system주소 + dummy(4 byte) + Shellcode주소식으로 공격을 하면 될거 같습니다. 먼저 system 함수 주소를 알아봅시다 디버깅을 위해 gremlin 복사 파일을 하나 만들고 이를 gdb로 엽니다, 그 후 인자없이 실행 시키면 if 문 안으로 들어가 printf 를 실행시키고 종료가 됩니다. 그러므로 20번째줄 printf에 브레이크포인트를 걸고 시스템 내부의 system 함수 주소를 보면 됩니당. system 함수 주소는 0x40058ae0 입니다. 어딘가에 적어두고 시스템 내에있는 shellcode 주소를 찾..