본문 바로가기

orge orc는 오크인데 orge는 뭘까 오르그?? 대놓고 여기여기 바꿨다고 써놨다. 보면 argc가 2여야하고 argv[1]을 마지막에 0으로 초기화한다. ( 다른 장치는 이전 문제와 같으니 생략하자 ) 그럼 argv[0] 하나가 남는다. argv[0]에 "0x90"*200 + "shell code"가 들어가야 한다. 그래서 저 문자열을 포함한 폴더를 하나 만들었다. 저 안에 troll파일을 넣어 분석해보면 argv[0]이 저장되는 위치를 알 수 있다. 0x90909090이 반복되는 부분이 argv[0]이 저장되는 위치이다. payload는 폴더이름때문에 쓸 수가 없다.... "\x90"*100 + "shellcode" + "\x90"*100으로 바꾸니 됐다. 왜 이건 되고 "\x90"*200 + "shell..
darkelf 들어가는 말을 포멧으로 만들던가 해야지 매번 할말이 없다. 코드나 보자 대놓고 '여기가 바뀜'이라고 해놨다. ( 나머진 똑같으니 생략했다. ) argb[0]이 77개가 되야된다. ./orge 이걸 어떻게 77개로 만들까 하니 ././././././././././././././././././././././././././././././././././././/orge 이것밖엔 생각이 안나서 이대로 해보았다. argv[0]을 77개로, 나머지는 저번 문제와 동일하게 테스트했다. argv[2]가 저장되는 주소가 0xbffffba4로 확인되었다. RET에 넣을 주소를 확인했으니 payload를 만들어보자 ./././././././././././././././././././././././././././././././..
wolfman 판타지 소설로 치닫고 있는 lob 이번엔 늑대인간 코드다 ( password도 늑대인간스럽다. ) 이번엔 argv[1]의 길이를 체크해준다. 이걸 우회할 방법을 이것저것 생각해봤다. 1. buffer에 shellcode 0x90이 많이 안들어가서 segmentation 오류가 계속 난다. 2. "A"*44+"주소"+"0x00"+"\x90"*200+"쉘코드" 해보니까 0x00뒤론 그냥 안들어간다. 삽질하다 검색으로 찾은 방법은 argv[2]이다. 결국 argv도 main의 parameter니까 ebp뒤에 있을거다. argv[2]에 쉘코드를 넣고 이 주소로 jump시키면 쉘코드를 실행할 것이다. argv에 \xbf를 48개 넣고 " "를 넣은 뒤 0x90을 200개 넣어보았다. ebp부터 쭉 찾아보니 909..
orc 이쯤되니 앞으로의 단계에 붙여질 몬스터 이름이 기대가 된다. goblin에서 buffer hunter가 추가되었다. goblin은 쉘코드를 buffer에 넣어서 푸는게 정석이었다보다. 그냥 goblin payload를 주소만 바꿔서 만들면 된다. 생략하고 payload는 다음과 같다. ./wolfman `python -c 'print "A"*44 + "\x80\xfb\xff\xbf" + "\x90"*200 + "\x31\xc0\x99\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\xb0\x0b\xcd\x80"'` 아예 똑같다....
goblin 코드ㄱㄱ egg hunter가 뭘까 싶고 그냥 payload를 쓰면 argv[1][47]가 뭐가 될지 모르겠다. 이 두 가지가 없다고 가정하고 일단 payload를 만들어보자. 0x080485c2는 strcpy를 수행한 다음 명령어이다. argv[1][47]이 0xbf로 맞춰야 하기 때문에 그냥 몽땅 0xbf로 넣었다. 0x00000013은 int i이고 이후 40byte가 buffer이므로 RET는 0xbffffb4c이다. 그럼 payload는 다음과 같다. ./orc `python -c 'print "A"*44 + "\x80\xfb\xff\xbf" + "\x90"*200 + "\x31\xc0\x99\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x..
cobolt 이번에도 바로 풀이 시~~작!! gremlin과 다른 점이라면 input을 argv가 아닌 stdin으로 받는다는 점이다. gremlin과 같은 payload를 stdin으로 주면 된다. 그래도 return할 주소값은 확인해보자 RET의 주소는 0xbffffb7c이다. gremlin의 payload를 RET주소 뒤의 임의의 주소를 실행하게만 바꿔주면 된다. stdin에 python code의 출력결과를 redirect해주는 방식이 따로 있다. (python -c 'print ""';cat) | ./goblin 이렇게 해주면 pipe로 연결되 python의 출력을 goblin의 stdin으로 사용하게 된다. 즉 payload는 다음과 같다. (python -c 'print "A"*20 + "\xa0\xfb..
gremlin 별달리 시작할 말이 없으니 바로 코드를 보겠습니다. gate와 달라진점은 buffer의 크기 한가지밖에 없다. 그런데 shellcode가 24byte인데 buffer + sfp를 해봐도 20byte밖에 안된다. 혹시 dump가 4byte쯤 있을지도 봤지만 그냥 16byte밖에 없다. 하지만 buffer overflow는 입력이 제한된 수를 넘어서 '무한정'들어가는 취약점이다. 즉 RET 위의 메모리에도 무한정 값이 들어가는 것이다. buffer에 A, SFP에 B, RET에 C를 넣고 뒤에는 D를 10개 채웠다. 즉 RET는 0xbffffb4c라는 것을 알 수 있다. RET보다 뒤에 있는 임의의 주소를 넣고 \x90을 충분히 넣은 뒤 shellcode를 입력하여 payload를 만들었다. ./cobolt..
gate system hacking을 차근차근 한번 공부해보기 위해 1단계로 bof를 골랐다. 그래서 이제 lob를 하나씩 풀기로 했습니다. 이것도 소스코드부터 확인해봅시다. 정말 대놓고 bof 문제다. 우선 풀이를 할 내용을 간단하게 요약하자면 1. 특정 메모리(주소를 알 수 있는)에 shellcode를 입력한다. 2. RET주소에 shellcode를 입력한 주소를 넣어준다. 말은 참 쉽다..... 뭘 하던 일단 gdb로 열어보았다. /tmp로 복사해서 열어봐야 볼 수 있다. stack에 dump는 없나보다. 선언한 256byte만 사용하고 있다. 그럼 일단 여기까지 payload는 "A"*260+"RET"이다. 우연히 알았지만 이 프로그램엔 ASLR이 걸려있지 않다. ASLR은 stack의 주소를 random..