목록정보보안 (24)
ii4gsp
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/CNq2i/btqBc57LvC5/vDKvNILsKuTSKUeL4NTrV1/img.png)
47번째 바이트가 \xff가 아니여야 하고 48번째 바이트가 \xbf가 되게 해야한다. ret의 주소가 0xbfff로 시작하면 \xff가 걸리기때문에 0xbfff이면 안된다. 파일을 /tmp 디렉토리에 복사해주고 gdb로 열어보자 strcpy() 함수가 호출되고 바로 다음 명령인 부분에 break point를 걸어주자 스택은 높은 주소부터 낮은 주소로 자라기 때문에 매개변수의 전달 값의 크기가 클수록 낮은 주소에 자리를 잡는다. \xbf 조건을 맞춰주고 argv[2]에 A 십만개를 스택에 채워 낮은 주소로 이동하였다. 주소가 0xbffe로 시작한다. 아무 주소나 ret로 잡고 페이로드를 작성하면 된다. payload ./vampire $(python -c 'print "\x90" * 44 + "\xe8\..
![](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......... 로 실행하기 때문에..
SEH (Structured Exception Handler) 프로그램에서 에러가 발생하면 경고창과 함께 꺼지는 현상이 일어난다. 이러한 것이 바로 예외 처리이다. 컴파일러는 SEH 체인을 만들고 관리하며, 예외가 발생하면 우선적으로 미리 등록된 체인의 핸들러를 실행하고, 해결되지 않으면 다음 단계의 핸들러를 실행한다. SEH 체인은 여러 개의 EXCEPTION_REGISTRATION 구조체를 통해 구성된다. Typedef struct _EXCEPTION_REGISTRATION { EXCEPTION_REGISTRATION *next; EXCP_HANDLER handler; } EXCEPTION_REGISTRATION, *PEXCEPTION_REGISTRATION; *next 멤버는 SEH 체인에 연결된 ..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/b7WlCz/btqA7pLXs2h/2rwJK23ALMDX9qoPIZrna1/img.png)
strcmp 함수를 우회 할 수 있다면 플래그를 얻는다고 한다. Start를 눌러주자 password 입력칸과 밑에 view-source가 있다. 소스코드를 보도록 하자 password : view-source /var/lib/dummy_file에서 password를 랜덤으로 가져오는데 입력값이 password와 같아야 한다. strcmp함수는 두 문자열이 같을 때 0을 반환한다. 하지만 strcmp 함수는 문자열과 배열을 비교했을때도 NULL을 반환한다. 즉, 0을 반환한다. 문자열과 배열을 비교하게되면 무조건 0을 반환한다. 아래와 같이 배열형태로 바꿔주면 무조건 0을 반환한다. 배열형태로 바꿔주고 아무 값이나 넣어주면 된다.
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/cBha8N/btqA8ieFaTN/X0xkQMJ7UmwFIlirAwApW1/img.png)
계정이있는데 차단되었다고한다. 필터링을 우회하는 문제인것 같다. id입력칸과 pw입력칸이 있다. get source를 눌러 소스코드를 보자. ID PW get source php 소스코드와 아래 주석이 있다. guest / guest blueh4g / blueh4g1234ps 두개의 차단당한 계정을 가지고있다. mysql_connect("localhost","login_filtering","login_filtering_pz"); mysql_select_db ("login_filtering"); mysql_query("set names utf8"); 쿼리를 연결 시키는 코드이다. $key = auth_code("login filtering"); $id = mysql_real_escape_string(tri..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/bIwc2n/btqBdUDkqcq/x8oqvObPEqTnSoEc1Q9pk1/img.png)
버튼을 클릭하라고 한다. 일단 Start를 눌러주자 click me!라는 버튼이있는데 마우스 커서와 위치가 맞지않아 클릭이 되지않는다. F12를 눌러 소스코드를 보면 ?key=85e4라는 경로로 이동한다. 현재 주소에서 ?key=85e4를 추가해주겠다.
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/cwrYVz/btqBc5dMnHW/kG88MCRkbbx8eH1HponFTK/img.png)
이전 문제와 크게 달라진건 없다 하지만 맨 밑줄 buffer 40byte를 모두 0으로 초기화 해준다. 문제푸는 방식은 이전 문제와 동일하다. 이전의 스택구조와 동일하다 i _____ buffer ______ SFP ______ RET strcpy()호출 다음인 에 break point를 걸어주고 0xbffffab4를 ret로 잡고 페이로드를 작성해주었다. payload ./wolfman $(python -c 'print "\xbf" * 44 + "\xb4\xfa\xff\xbf" + "\x90" * 100 + "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x89\xc2\xb0\x0b\xcd\x80"')
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/cqqGHZ/btqA2T7gZhl/ZNrnuJ5CJNOmqk2DZX8Zk0/img.png)
힌트를 보니 다른 문제와는 다르게 소스코드가 아주 길다. count가 100이상이면 "what are you trying to do?"라는 문장을 출력한다. check가 0xdeadbeef라면 shellout함수를 실행시킨다. 사용자로부터 입력을 받고 입력받은 값에서 1byte를 읽고 1byte의 값이 0x08이면 count 값을 -1한다. byte값이 \r, \n, 0x08 모두 아니라면 string[count]에 입력한 1byte 값을 대입하고 count 값을 +1한다. shellout함수는 쉘을 실행시킨다. 변수가 선언된 순서를보면 string변수가 먼저 선언되고 check변수가 선언되었다. ret변조는 불가능하다 그래서 check값을 0xdeadbeef로 해줘야한다. check변수가 string보..