시스템 해킹

 1576, 1/79 회원가입  로그인  
   garbage0192
   BOF 원정대 goblin(level 4) 다시 한 번 더 질문이요!!

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


안녕하세요. 초보입니다.
어제 이 문제에 대해서 질문을 올렸는데 cd80님께서 친절히 가르쳐주신 덕에 다시 풀 수 있었습니다.

근데 한 가지 더 의문점이 생겼습니다.

리턴 어드레스를 제외하고 채워야할 메모리 크기가 44바이트인데 쉘 코드가 27바이트인 관계로 나머지 17바이트를 채워야하는데요. 이 때 저는 NOP인 \x90으로 채웠었습니다. (다른걸로는 안 해봐서 되는지 모르겠네요)
그래서 쉘코드(27 바이트) + NOP(17 바이트) + RET(4 바이트) 로 채우니까 잘 되었습니다.
근데 쉘코드를 버퍼 제일 처음이 아닌 중간에 넣으면 어떻게 될까하고 실험을 해봤습니다. 총 18번 실험을 했습니다.

실험은 쉘코드를 버퍼의 제일 처음부터 1바이트씩 옮겨서 버퍼를 채우는 것이었는데 결과는 다음과 같았습니다.

앞쪽 NOP의 개수 / 결과
0 / 성공
1 / 성공
2 / 성공
3 / 성공
4 / 성공
5 / 성공
6 / Segmentation fault
7 / Illegal instruction
8 / Segmentation fault
9 / Illegal instruction
10 / Segmentation fault
11 / Illegal instruction
12 / Segmentation fault
13 / Illegal instruction
14 / Segmentation fault
15 / Illegal instruction
16 / Segmentation fault
17 / Segmentation fault

왜 NOP가 앞쪽에 있는게 5개까지는 괜찮을까요? 또 왜 6개부터는 안 될까요?
그리고 6개 이후로 에러 나는게 17개째는 다르지만 뭔가 규칙성이 있는데 혹시 아시나요?

또 메모리를 확인하려고 gdb을 돌렸는데 gdb에서는 main 함수가 끝나자마자 SIGTRAP 발생했다고 안되더군요. gdb 상에서는 그럼 프로그램을 공격을 해 볼 수 없는건가요?
아 또 하나 gdb에 프로그램을 올리고 하니까 버퍼 주소가 같은 인자를 받음에도 불구하고 다르게 나오더군요. 원래 그런건가요?

감사합니다.

아 그리고 cd80님. 혹시 보신다면, 저번 질문 댓글에 프로그램명의 길이와 쉘코드의 위치에 대한 상관관계에 대해 질문했었는데 혹시 답해줄 수 있나요?ㅎㅎ

  Hit : 4878     Date : 2013/04/05 11:03



    
cd80 질문해주신 내용은 글보다 그림으로 보시는게 훨씬 이해가 쉽습니다
http://cd80.tistory.com/3
15~18쪽을 보시면 됩니다
문서에서 그 이외의 내용은 풀이이니 공부하실 목적으로 lob를 풀고 계신거라면 안보시는게 좋습니다


프로그램명의 길이가 메모리상 쉘코드의 위치에 영향을 미치는 이유는
메모리의 마지막부분에 환경변수가 존재하는데 환경변수 맨 마지막부분에 프로그램명도 같이 들어가있기 때문입니다
[root@localhost /root]# gdb -q ./test
(gdb) b main
Breakpoint 1 at 0x80483d3
(gdb) r
Starting program: /root/./test

Breakpoint 1, 0x80483d3 in main ()
(gdb) x/s 0xbfffffff-500
0xbffffe0b: ""
(gdb)
0xbffffe0c: "LANG=en_US"
(gdb)
0xbffffe17: "OSTYPE=Linux"
(gdb)
0xbffffe24: "SHLVL=1"
(gdb)
0xbffffe2c: "LS_COLORS=no=00:fi=00:di=01;34:ln=01;36:pi=40;33:so=01;35:bd=40;33;01:cd=40;33;01:or=01;05;37;41:mi=01;05;37;41:ex=01;32:*.cmd=01;32:*.exe=01;32:*.com=01;32:*.btm=01;32:*.bat=01;32:*.sh=01;32:*.csh=01"...
(gdb)
0xbffffef4: ";32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.gz=01;31:*.bz2=01;31:*.bz=01;31:*.tz=01;31:*.rpm=01;31:*.cpio=01;31:*.jpg=01;35:*.gif=01;35:*.bmp=01;3"...
(gdb)
0xbfffffbc: "5:*.xbm=01;35:*.xpm=01;35:*.png=01;35:*.tif=01;35:"
(gdb)
0xbfffffef: "/root/./test"
(gdb)
2013/04/06  
garbage0192 //cd80
감사합니다! 결국 푸시를 사용하는 쉘코드와 esp가 너무 가까이 있어서 그랬던거군요! 또 하나 배우고 갑니다.
2013/04/06  
garbage0192 쉘코드에서 esp값을 바꾸니 NOP을 어떻게 넣든지 잘 되네요! 2013/04/06