목록문제풀이 (39)
ii4gsp
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/dgOIwd/btqBkp4zAkS/Cke9CdW9dA8Rw9ZSfYyoi1/img.png)
include #include #include #include #include struct internet { int priority; char *name; }; void winner() { printf("and we have a winner @ %d\n", time(NULL)); } int main(int argc, char **argv) { struct internet *i1, *i2, *i3; i1 = malloc(sizeof(struct internet)); i1->priority = 1; i1->name = malloc(8); i2 = malloc(sizeof(struct internet)); i2->priority = 2; i2->name = malloc(8); strcpy(i1->name, ..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/94Svd/btqBh2vc2ZV/2V9AlVSkPyQfK4tDhpklqk/img.png)
#include #include #include #include void vuln(char *string) { volatile int target; char buffer[64]; target = 0; sprintf(buffer, string); if(target == 0xdeadbeef) { printf("you have hit the target correctly :)\n"); } } int main(int argc, char **argv) { vuln(argv[1]); } 앞에서 나온 Stack문제와 동일해서 딱히 설명할 부분이 없다. 버퍼에 64를 채우고 0xdeadbeef를 리틀 엔디언 방식으로 전달해주면 된다. ./format0 $(python -c 'print "\x90" * 64 + "\xe..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/bdnA1V/btqBf32MNYj/0kPRetwORqjnKd80YAQlek/img.png)
#include #include #include #include char *getpath() { char buffer[64]; unsigned int ret; printf("input path please: "); fflush(stdout); gets(buffer); ret = __builtin_return_address(0); if((ret & 0xb0000000) == 0xb0000000) { printf("bzzzt (%p)\n", ret); _exit(1); } printf("got path %s\n", buffer); return strdup(buffer); } int main(int argc, char **argv) { getpath(); } ret의 시작 주소가 b로 시작하면 안된다. ROP..
![](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..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/dunLJS/btqBeyO5ABS/4qhCTxqGCTEsMsF2ippTL0/img.png)
argc의 인자가 2개 이상일 수 없는 조건이 나왔다. 즉, argc, argv[0]만 사용가능하다. 실행파일의 이름에 쉘코드를 올려놓고 해당 주소로 ret하면 된다. 25byte쉘 코드는 \x2f가 있어서 디렉토리가 생성되기 때문에 \x2f없는 48byte 쉘 코드를 사용하였다. gdb로 파일을 열기위해 troll파일의 복사본 심볼릭링크 파일을 만들어주었다. 복사본 심볼릭링크 파일을 gdb로 열어서 분석해보자 strcpy()함수 다음명령인 부분에 break point를 걸어주자 break point를 걸고 \xbf 조건을 맞춰주고 이제argv[0]의 주소를 찾아주자 argv[0]의 주소는 0xbffffc1e이다. 0xbffffab0을 주소로 잡고 페이로드를 작성하겠다. troll 파일의 심볼릭링크 파일..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/Hhf4Y/btqBeSGhMZS/DamaOPFfbpphV8cJkKjYLk/img.png)
이전 문제에서 argv[0]이 77이 아니라면 에러문자와 함께 프로그램이 종료된다. 즉, 파일의 이름이 77이여야 한다. gdb로 열기위해 /tmp/ 폴더에 저장을 해주자 파일명이 72글자인 이유는 앞의 경로 /tmp/의 글자를 -5 해준것이다. gdb로 분석을해보자 strcpy() 함수가 호출되고 실행되는 명령인 부분에 break point를 걸어주자 48번째 바이트가 \xbf가 되도록 하고 argv[2]에 A를 100개 넣었다. 값을 확인해보자 0xbffffb64를 ret의 주소로 잡고 페이로드를 작성하였다. ln -s orge $(python -c 'print "A" * 75') 명령어로 orge파일을 A * 75개의 이름으로 만들어주고 75인 이유는 ./AAAA......... 로 실행하기 때문에..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/cveBXa/btqA7qKXGIr/y983irbKCuk29rxEyyByvK/img.png)
이 데이터베이스의 종류가 뭔지 물어보고 user name과 데이터베이스의 관계를 찾아야 한다고 한다. Start를 눌러주자 로그인창이 나온다. admin을 입력해보자 admin으로 접근하지 말라고 한다. 다른 문자들을 넣어보자. !, @, #, $, % 등 특수문자들을 넣어보았지만 모두 똑같이 로그인이 되고 아무런 동작을 하지않는다. /를 넣어 로그인을 하였을때 에러가 발생하였다. 에러를 분석해보면 ./db/wkrm_"입력한 문자".db에 저장이 된다. 저 경로로 /대신 아까 접근 제한을받은 admin의 db파일을 열어보자. url을 입력하면 db파일이 다운받아진다. db파일을 hxd로 열고 밑으로 내려보니 "Congratulation!! Here is flag!"라는 문자가 보인다. flag가 있는 ..