목록Stack (15)
ii4gsp
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/VnoDi/btqBf3obMls/qk2vx4thJH3bcBukhKJzz0/img.png)
#include #include #include #include void getpath() { char buffer[64]; unsigned int ret; printf("input path please: "); fflush(stdout); gets(buffer); ret = __builtin_return_address(0); if((ret & 0xbf000000) == 0xbf000000) { printf("bzzzt (%p)\n", ret); _exit(1); } printf("got path %s\n", buffer); } int main(int argc, char **argv) { getpath(); } ret가 0xbf로 시작하면 "bzzzt (%p)"문자와 함께 프로그램이 종료된다. RTL기법..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/ct6AEH/btqBfrvQ3Nr/bVSOUOrPK67qqcyEviYiXK/img.png)
#include #include #include #include int main(int argc, char **argv) { char buffer[64]; gets(buffer); } 쉘을 획득하는 문제이다. 스택을 0x50 할당하였다 0x50은 10진수로 80이다 int argc, char **argv, char buffer[64] 세 변수의 크기를 더하면 72이다. 80 - 72 = 8 dummy는 8이다. 프로그램 종료 직전에 break point를 걸어주고 스택에 "A"를 100개 채워주었다. 값을 확인해보자 0xbffff93c를 ret 주소로 잡고 페이로드를 작성하겠다. 쉘 코드는 25byte 짜리를 사용하겠다. \x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/eIIs9g/btqBgdcPK6G/hxqlRd9YEUb7lgq4hKo9RK/img.png)
#include #include #include #include void win() { printf("code flow successfully changed\n"); } int main(int argc, char **argv) { char buffer[64]; gets(buffer); } ret를 win() 함수의 시작 주소로 조작해야한다. 스택이 0x50만큼 할당되었다 0x50은 10진수로 80이다 int argc, char **argv, char buffer[64] 3개의 변수 크기를 더하면 72이다 80 - 72 = 8 dummy는 8이다. 0x080483f4가 win() 함수의 시작 주소이다. 리틀 엔디언 방식으로 ret를 덮어주면 된다. 페이로드는 buffer[64byte] + dummy[8by..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/ceUHS6/btqBfrQbMr1/P2gt3V0vrcVvyvN0lDIIi0/img.png)
#include #include #include #include void win() { printf("code flow successfully changed\n"); } int main(int argc, char **argv) { volatile int (*fp)(); char buffer[64]; fp = 0; gets(buffer); if(fp) { printf("calling function pointer, jumping to 0x%08x\n", fp); fp(); } } win() 함수를 호출시키는 문제이다. dummy가 없다는 가정하에 구조이다. "A"를 68번 입력하면 fp의 주소값이 0x41로 덮힌다. buffer 64byte를 채워주고 win() 함수의 시작주소로 덮어주면 win() 함수가..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/CyiEz/btqBgfaCvVN/7TAHaKo8RqtNnBzWaTHEdk/img.png)
#include #include #include #include int main(int argc, char **argv) { volatile int modified; char buffer[64]; char *variable; variable = getenv("GREENIE"); if(variable == NULL) { errx(1, "please set the GREENIE environment variable\n"); } modified = 0; strcpy(buffer, variable); if(modified == 0x0d0a0d0a) { printf("you have correctly modified the variable\n"); } else { printf("Try again, you got ..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/dcXBUQ/btqBhDV6LoG/uk3k2viYgKb5MUBYkyJyBK/img.png)
#include #include #include #include int main(int argc, char **argv) { volatile int modified; char buffer[64]; if(argc == 1) { errx(1, "please specify an argument\n"); } modified = 0; strcpy(buffer, argv[1]); if(modified == 0x61626364) { printf("you have correctly got the variable to the right value\n"); } else { printf("Try again, you got 0x%08x\n", modified); } } 이전 문제와 스택의 구성은 같다. if(modified ..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/tJ8Wf/btqBh1JdlIt/pKJMXy97qGAUPEKK39UkK0/img.png)
#include #include #include int main(int argc, char **argv) { volatile int modified; char buffer[64]; modified = 0; gets(buffer); if(modified != 0) { printf("you have changed the 'modified' variable\n"); } else { printf("Try again?\n"); } } modified 변수가 buffer보다 먼저 선언 되었으니 스택의 구조 if(modified != 0) 조건에서 modified는 0이므로 "Try again?"이라는 문자가 출력된다. 하지만 buffer변수 64byte를 넘어 "A" 65개의 값을 준다면 버퍼가 넘쳐 modifie..