시스템 해킹

 1576, 1/79 회원가입  로그인  
   you88311
   FTZ level11 관련 질문 있습니다.

http://www.hackerschool.org/HS_Boards/zboard.php?AllArticle=true&no=1898 [복사]


포맷스트링,버퍼오버플로우로 모두 문제를 풀었습니다.
문제는 원래 ftz.hackerschool.org가 아닌 직접 ftz 서버를 구축한 곳에서는
완전히 동일한 방법으로 버퍼오버플로우를 사용했는데도 불구하고 공격이 안되더군요. 특히 gdb로 봤을 때
원래 ftz서버 같은 경우에는

(gdb) r `python -c 'print "A"*264+"B"*4+"C"*4'`
Starting program: /home/level11/tmp/attack `python -c 'print "A"*264+"B"*4+"C"*4'`

Breakpoint 1, 0x08048470 in main ()
(gdb) x/130x $esp
0xbffff9dc:     0x40033917      0x00000002      0xbffffa24      0xbffffa30
0xbffff9ec:     0x4001582c      0x00000002      0x08048370      0x00000000
0xbffff9fc:     0x08048391      0x08048470      0x00000002      0xbffffa24
0xbffffa0c:     0x080482e4      0x08048500      0x4000c660      0xbffffa1c
0xbffffa1c:     0x00000000      0x00000002      0xbffffb0e      0xbffffb27
0xbffffa2c:     0x00000000      0xbffffc38      0xbffffc56      0xbffffc66
0xbffffa3c:     0xbffffc71      0xbffffc7f      0xbffffca0      0xbffffcb3
0xbffffa4c:     0xbffffcc0      0xbffffe83      0xbffffec6      0xbffffee3
0xbffffa5c:     0xbffffef9      0xbfffff0e      0xbfffff1f      0xbfffff30
0xbffffa6c:     0xbfffff43      0xbfffff4b      0xbfffff6a      0xbfffff7a
0xbffffa7c:     0xbfffffac      0xbfffffce      0x00000000      0x00000010
0xbffffa8c:     0x0fabfbff      0x00000006      0x00001000      0x00000011
0xbffffa9c:     0x00000064      0x00000003      0x08048034      0x00000004
0xbffffaac:     0x00000020      0x00000005      0x00000006      0x00000007
0xbffffabc:     0x40000000      0x00000008      0x00000000      0x00000009
0xbffffacc:     0x08048370      0x0000000b      0x00000c13      0x0000000c
0xbffffadc:     0x00000c13      0x0000000d      0x00000c13      0x0000000e
0xbffffaec:     0x00000c13      0x0000000f      0xbffffb09      0x00000000
0xbffffafc:     0x00000000      0x00000000      0x00000000      0x38366900
0xbffffb0c:     0x682f0036      0x2f656d6f      0x6576656c      0x2f31316c
0xbffffb1c:     0x2f706d74      0x61747461      0x41006b63      0x41414141
0xbffffb2c:     0x41414141      0x41414141      0x41414141      0x41414141
0xbffffb3c:     0x41414141      0x41414141      0x41414141      0x41414141

로 제가 입력한 인자들이 나오는데 직접 구축한 ftz서버 같은 경우

(gdb) b *main
Breakpoint 1 at 0x8048470
(gdb) r `python -c 'print "A"*264+"B"*4+"C"*4'`
Starting program: /home/level11/tmp/hello `python -c 'print "A"*264+"B"*4+"C"*4'`

Breakpoint 1, 0x08048470 in main ()
(gdb) x/100x $esp
0xbfffeacc:     0x42015574      0x00000002      0xbfffeb14      0xbfffeb20
0xbfffeadc:     0x4001582c      0x00000002      0x08048370      0x00000000
0xbfffeaec:     0x08048391      0x08048470      0x00000002      0xbfffeb14
0xbfffeafc:     0x080482e4      0x08048500      0x4000c660      0xbfffeb0c
0xbfffeb0c:     0x00000000      0x00000002      0xbffffb0b      0xbffffb23
0xbfffeb1c:     0x00000000      0xbffffc34      0xbffffc52      0xbffffc62
0xbfffeb2c:     0xbffffc6d      0xbffffc7b      0xbffffc9d      0xbffffcb0
0xbfffeb3c:     0xbffffcbd      0xbffffe80      0xbffffec3      0xbffffee0
0xbfffeb4c:     0xbffffef6      0xbfffff0b      0xbfffff1c      0xbfffff2d
0xbfffeb5c:     0xbfffff40      0xbfffff48      0xbfffff67      0xbfffff77
0xbfffeb6c:     0xbfffffad      0xbfffffcf      0x00000000      0x00000020
0xbfffeb7c:     0xffffe000      0x00000010      0x0fabfbff      0x00000006
0xbfffeb8c:     0x00001000      0x00000011      0x00000064      0x00000003
0xbfffeb9c:     0x08048034      0x00000004      0x00000020      0x00000005
0xbfffebac:     0x00000006      0x00000007      0x40000000      0x00000008
0xbfffebbc:     0x00000000      0x00000009      0x08048370      0x0000000b
0xbfffebcc:     0x00000c13      0x0000000c      0x00000c13      0x0000000d
0xbfffebdc:     0x00000c13      0x0000000e      0x00000c13      0x0000000f
0xbfffebec:     0xbffffb06      0x00000000      0x00000000      0x00000000
0xbfffebfc:     0x00000000      0x00000000      0x00000000      0x00000000
0xbfffec0c:     0x00000000      0x00000000      0x00000000      0x00000000
0xbfffec1c:     0x00000000      0x00000000      0x00000000      0x00000000
0xbfffec2c:     0x00000000      0x00000000      0x00000000      0x00000000

아무리 내려가도 0x00000000 만 나타나고 제가 입력한 인자값이 보이지 않습니다. 어떤 차이 때문에 이러한 일이 일어나는지 알려주시면 정말 감사하겠습니다.

  Hit : 3368     Date : 2017/09/27 01:09



    
김답변 더 내려가면 보일텐데요 정 안보인다면 다른방법도 있습니다 main함수의 프롤로그와 에필로그를 제외한 부분, 그러니까 메인함수의 스택프레임이 그대로 esp와 ebp에 의해서 가르켜지는 부분 아무곳이나 브레이크포인트를 걸고
그 시점에서 ebp가 가르키는것은 SFP, ebp+4는 리턴어드레스, ebp+8은 argc, ebp+12는 argv배열을 가르킵니다
x/2wx $ebp+12 하시면 argv[0]과 argv[1]이 순서대로 나오고
여기서 x/s argv[1]위치에 있는 주소
하시면 입력하신게 출력되고 주소도 보일겁니다
2017/09/27  
you88311 오오 생각해보니 어짜피 인자니 ebp+12로 하는 것도 가능하군요!! 그래도 여전히 본 ftz서버에서는 먹히는데 구축한 ftz서버에서는 안되네요ㅎㅎ 좀 더 공부해봐야겠네요 어쨌든 답변 정말 감사합니다!! 2017/09/27  
김답변 이상하네요 ㅋㅋ 올려주신 메모리덤프에보면 본섭에서는 argv[1]이 0xbffffb27, env[0]이 0xbfffffc38
그리고 구축하신거에선 argv[1] = 0xbffffb23, env[0] = 0xbffffc34
두개의 거리차가 같아서 분명 잘 올라갔을것같은데요
FTZ서버를 직접 구축할때의 문제점은 사실 이렇게 gdb로 볼 때 스택에 올라가냐 안올라가냐에서 문제가 생기진 않고 gdb에서 확인한 주소로 리턴했을때 쉘이 안따이는 문제가 있는데, ftz 본섭에서는 스택에 ASLR이 도입되기 전 커널을 쓰고 있고 직접구축하면 스택에 ASLR이 있는 버젼으로 구축하기때문에 스택프레임이나 argv로의 리턴이 어렵고, 스택에 ASLR이 걸려있는데 이상하게 환경변수있는쪽은 ASLR이 없어서 에그쉘이나 RTL을 이용해서 풀어야 합니다
2017/09/28  
you88311 아아아아!! 제가 알고 싶었던게 이거였습니다. 서로 커널 버전이 달라 ASLR면에서 차이가 있군요ㅠㅠㅠ 사실 구축한 ftz에서 call strcpy 이곳에 break 걸고 버퍼 확인하면 스택에 4141이 나오는데 그 주소로 아무리 해도 쉘이 안나오더군요. while문으로 반복 돌려도 해결이 안돼서 뭔가 잘못하고있구나 싶어서 아예 초반 함수 프롤로그??에 break걸고 인자 확인한 건데 여기서는 아예 argv가 안본여서 질문한거였습니다. 포맷 스트링이랑 환경변수로는 다 되는데 이 공격만 안통하더구요.
덕분에 속시원하게 알아갑니다. 감사합니다!!!
2017/09/28