목록Wargame/LOB (21)
cgy12306
ID : death_knightPW : got the life
ID : xaviusPW : throw me away server_fd = socket(AF_INET, SOCK_STREAM, 0) == -1 인터넷에 접속하여 스트림 방식으로 입출력하는 소켓 생성, 실패시 -1 반환. htons()함수는 받은 데이터를 네트워크 byte order로 변경한다. 네트워크 byte order은 big endian 방식을 사용한다.bzero() 함수는 첫번째 인자부터 두번째 인자 만큼 바이트 스트링에 0을 쓴다.bind() 함수는 소켓에 IP주소와 포트번호를 지정해준다. 성공시 0 실패 시 -1을 반환한다listen() 함수는클라이언트 접속 요청을 확인한다. 두번째 인자는 대기 메시지 큐의 개수를 뜻한다.accept() 함수는 소켓에 연결을 받아 들인다.send() 함수는 연..
ID : nightmarePW : beg for me buffer의 48번째 byte가 \xbf와 \x08이어서는 안된다. 그리고 memcpy는 같으면 0을 반환하고, 다르면 0이 아닌 다른 값을 반환하게 되는데 memcpy의 반환값이 0이어야 while문을 돌지 않는다. 혹은 ret_addr의 첫번째 byte가 \xc9과 그 다음 주소의 첫번째 바이트가 \xc3이 아니면 된다. fgets의 함수의 인자는 char * fgets(char * str, int num, FILE * stream);로 된다. fget으로 받은 값을 stdin에 저장에 저장한다. 또, 소스코드를 보면 0x40대역은 초기화 하지 않는다. stdin의 주소를 확인해보자. stdin + 4와 +8의 주소 안에는 입력이 끝난 시점의 메..
ID : succubusPW : here to stay 문제 힌트는 PLT라고 나와 있다. plt는 외부 프로시저를 연결해주는 테이블이다. plt를 통해 다른 라이브러리에 있는 프로시저를 호출해 사용할 수 있다. 소스코드를 보면 strcpy의 주소를 buffer의 45번째부터 4byte를 비교해서 아니면 종료시키고, 맞으면 strcpy함수와 printf함수를 실행시킨 후 buffer의 49번째부터 4byte를 A로 바꾼다. 즉, strcpy 함수로 ret의 주소를 strcpy의 plt로 바꿔서 main함수가 끝난후에 strcpy함수를 다시 실행 해도 strcpy의 return address를 AAAA로 덮어지기 때문에 Segmentation fault가 뜨게 된다. 우선 strcpy의 주소를 알아보자. ..
ID : zombie_assassinPW : no place to hide strchr은 해당 문자열에 특정 문자가 있으면 참을 반환한다. 그래서 \x40을 쓰게 되면 종료를 하게 된다.memcmp는 두 문자열을 비교한다. 해당 소스코드는 4byte만큼 비교해서 같으면 0을 반환하고, 다르면 0이 아닌 값을 반환한다. 즉, 다르면 종료한다. 그 이후 strcpy가 실행된다. 45번째부터 4byte가 &addr과 같아야 한다. main+88 부분을 보게 되면 %ebp-44에 0x80487ec를 넣는 것을 볼 수 있다. 그 부분을 분석해보자. Do 함수라는 것을 알 수 있다. 여기까지 생각할 수 있는 것은 A를 44개 넣고 그 뒤에 Do의 주소를 넣어 함수를 호출하면 된다는 것이다. ./succubus `p..
ID : assassinPW : pushing me away assassin문제는 buffer에 복사할 때 48byte만 복사를 한다. Fake Ebp를 사용하면 될 것이다. Fake Ebp는 sfp값을 변조해서 leave 과정에서 이전 함수의 ebp를 변조된 값으로 복구 시키고, 그 다음 ret에 leave-ret을 다시 실행해서 원하는 주소로 갈 수 있게 하는 기법이다. 시나리오를 생각해보자. sfp를 buffer-4로 조작하고, ret에 leave-ret 가젯을 넣어준다. 그러면 leave 과정에서 이전 함수의 ebp를 복구하기 위해 현재 sfp(buffer-4)값을 넣고, 돌아온 &(ebp + 4byte)값을 ret 주소로 삼을 것이다. 마지막 ret 주소에 system 함수를 호출하는 주소를 넣..
ID : giantPW : one step closer return address에 들어갈 값이 bf와 40이면 종료를 한다. 어셈블리어로 봤을 때 ret의 주소는 0x0804851e이다. 필터링에 걸릴 것이 없다. 그러면 ret에 ret을 넣어줘서 다시 ret을 실행할 수 있게 해줄 수 있다.(Ret Sled기법) ret은 return address를 eip에 넣고, 해당 주소로 이동한다. 간단하게 설명하자면pop eipjmp eip로 표현이 가능하다. /bin/sh의 주소를 알아보자. system의 주소를 확인해 보자. A를 44개 넣어서 스택을 확인해보자. 시나리오를 구상해보면 A를 44개 넣어주고, ret이 실행될 때 다시 ret을 실행시켜서 system함수를 호출한다. 그 후에 /bin/sh을 ..
ID : bugbearPW : new divide execve 오프셋과 libc base값을 더해서 execve_addr을 만들고, 입력한 두번째 인자에서 4byte를 긁어와서 같지 않으면 종료를 하고 같으면 strcpy 함수를 실행한다. execve의 주소를 알아보자. print execve를 입력하면 주소를 알 수 있다. 시나리오를 구상해 보자. 우선 A를 44개 넣고, execve 주소로 ret을 덮어준 후 execve가 실행이 되고나서 다시 system 함수를 호출하게 할 것이다. 페이로드를 구상해보면 "A"*44 + "execve 주소" + "system 주소" + "dummy" + "/bin/sh이 있는 주소"가 될 것이다. dummy를 넣어주는 이유는 system이 호출되고 나서 리턴할 주소..