[LOB] troll -> vampire
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | /* The Lord of the BOF : The Fellowship of the BOF - vampire - check 0xbfff */ #include <stdio.h> #include <stdlib.h> main(int argc, char *argv[]) { char buffer[40]; if(argc < 2){ printf("argv error\n"); exit(0); } if(argv[1][47] != '\xbf') { printf("stack is still your friend.\n"); exit(0); } // here is changed! if(argv[1][46] == '\xff') { printf("but it's not forever\n"); exit(0); } strcpy(buffer, argv[1]); printf("%s\n", buffer); } | cs |
1) ret중 bf와 ff체크 -> bff00000 보다 낮은 주소를 써야한다
스택은 높은주소부터 낮은주소로 거꾸로 자란다
argv[2]까지 전달했다면 스택에는 argv[2],argv[1],argv[0] 순서로 저장이 된다 즉, 숫자가 높은 인자부터 스택에 저장이된다
higher address
| argv[2] |
| argv[1] | ↓ 스택의 진행 방향
| argv[0] |
lower address
여기서 argv[2], 즉 세번째 인자가 길어지면? 그 다음 스택에 저장되는 argv[1]는 더 낮은 주소에서 시작하게 된다
vampire의 소스를 변경해 argv[1]의의 주소를 출력하도록 하는 vampir1를 컴파일하고 실행했다.
argv[2]를 주지 않았을 때 argv[1]는 bffffc65에서 시작한다
그리고 argv[2]에 A를 20000개 주었더니 주소가 낮아진 것을 확인할 수 있다.
90000개쯤 늘려보니 드디어 bf"fe"9cd4, ff가 아닌 주소가 나왔다.
페이로드와 Password
'System > LOB' 카테고리의 다른 글
[LOB] skeleton -> golem (0) | 2015.04.07 |
---|---|
[LOB] vampire -> skeleton (0) | 2015.04.01 |
[LOB] orge -> troll (0) | 2015.04.01 |
[LOB] darkelf -> orge (0) | 2015.03.31 |
[LOB] wolfman -> darkelf (0) | 2015.03.25 |