목록Wargame (35)
농소
[ dark_stone ] 문제를 보시면 문제푸는 요령은 전 문제와 동일합니다.차이점은 remote bof를 통해서만 권한을 딸 수 있는데요nc를 이용하여 외부에서 공격해주시면 되는 문제입니다. 이전 문제와 동일하게 우선 가젯들을 모아봅시다. ppr 가젯 0x080484f3 strcpy's plt = 0x8048438printf's plt = 0x8048408 printf's got = 0x0804984c system = 0x007507c0이제 system의 주소와 동일한 값들을 1바이트씩 찾아봅니다. 가젯들을 전부 모았으니 정리해 봅시다 0x7507c0 :printf's plt = 0x8048408= "\x08\x84\x04\x08"printf's got = 0x804984c= "\x4c\x98\x04..
[ evil_wizard ] 이번에는 fake ebp를 막았고 고맙게도 문제에서 //healing potion을 주었네요system함수를 이용해 쉘을 실행시키면 권한이 상승할 것입니다.힌트로 GOT overwriting을 이용하라고 나와있네요 코드 제일 밑에 수행되는 printf함수의 GOT를 system GOT로 변환하면 될것 같습니다.그러기위해선 고정값이 되는 지점에서의 값을 strcpy를 통해서 GOT를 변경해야하는데요system의 got값을 가르키는 주소를 찾아야 strcpy를 할 수있는데 아쉽게도 그런값을 가지고 있는 곳은 없습니다.그러면 어떻게 해야하느냐?변하지않는 영역의 값을 살펴봐 1바이트씩 해당 코드를 찾아 strcpy를 해주면 됩니다. strcpy를 4번 해주면 되겠네요하지만 여기서 문..
[ hell_fire ] 이번문제느 remote bof를 이용하라고 나오네요그리고 fake ebp나 got를 이용하면 된다고하니 저는 fake ebp를 이용해 보겠습니다. 공격할 파일을 본 결과 setuid가 걸려있질 않아 RTL을 이용해도 권한이 떨어지질 않습니다.소스코드를 보면 알듯이 슈퍼데몬을 이용하여 공격을 해야하는데요 해당 xinetd.d 디렉토리에 들어가 hell_fire를 보면 알 듯이이 파일을 원격으로 접속할때는 사용자가 hell_fire인것을 알 수 있습니다.즉, 원격으로 할 시 setuid설정이 되어있다고 보시면됩니다. 즉 파이프라인으로 공격할 때 nc를 이용하여 원격접속을 이용하면 될것입니다. payload | ./hell_fire ( x )payload | nc localhost 7..
[ dark_eyes ] fake ebp를 막고힌트로 RET sleding을 이용하라고 나와있네요ret sleding이란 에필로그에 ret주소를 넣고 반복적으로 사용하여 공격자가 원하는 위치로 eip를 변경할 수 있게 하는 기법입니다. dummy 268 | dddd 를 넣어본 결과입니다. 보시면 랜덤스택이 적용이 되었는데도 메모리값이 바뀌질 않는곳이 있습니다. 다시한번 실행해서 본 결과 빨간색으로 네모친 부분의 값이 변경이 안됨을 알 수 있습니다.이것을 execl의 첫번째 인자로 잡고서 공격을 진행해 보겠습니다.execl( "/bin/my-pass", NULL );으로 생각하고 만들어볼 생각입니다. 자 우선 해당위치가 첫번째 인자로 쓰기위해 ret sleding을 이용하여 위치를 바꾸어줍니다.ret주소를..
페도라캐슬 1층 iron_golem.c파일입니다보시는바와 같이 저번 LOB의 첫번째문제인 gremlin과 문제가 같습니다.딱 보면 디버거를 실행을 하지 않아도 bof을 할 수 있을정도로 매우 취약한 파일처럼 보입니다. 그러나 이 FC1층부터는 버전이 업데이트 되면서 메모리보호기법이 적용 되었는데요 1. 스택가드 : 더미 생성 - 스택내에 함수의 변수 크기를 정확하게 예측하지 못하게 더미값을 추가합니다. 2. 아스키 아머 - 라이브러리의 영역이 가장 낮은 영역으로 이동됨 ( 0x00번지에 위치 ) - RTL을 이용 할 시 라이브러리 호출은 되지만 인자값을 맘대로 변형이 불가능함. 3. 랜덤스택 (ASLR = Address Space Layout Randomization ) - 실행을 할 때마다 메모리 주소..
단순히 소켓을 통해 외부에서 bof를 해주면 되는 문제입니다. 현재 버퍼크기는 40바이트인데while문의 recv를 보시면 buffer에 256바이트 크기를 받고있습니다.bof가 발생하게 됩니다. [xavius@localhost xavius]$ ps -efdeath_kn 646 1 0 Feb21 ? 00:00:00 /home/xavius/death_knight프로세스를 보니 현재 실행중임을 알수 있으니 이를 통하여 nop코드와 쉘코드를 넣고 외부에서 보내주면 되겠네요 파이선으로 코드를 작성하면from socket import * payload = b'A' * 44payload += b'\x12\xfd\xff\xbf'payload += b'\x90' * 100payload += b"\x66\xbd"payl..
분석 해 봅시다LD_PRELOAD도 못쓰고 eip를 제외한 스택메모리를 전부 초기화합니다.또, 스택메모리를 못쓰게 막았고=("\bf") text영역도 못쓰게 막았네요=("\x08")그리고 leave, ret 명령어가 있는 함수들이 있으면 강제로 종료되게 만들었습니다.여기서 의문점은 왜 40으로 막질 않고 궂이 이런식으로 막아놨을까 입니다.즉, 저렇게 막아도 40으로 시작하는 사용가능한 메모리영역이 있다는 겁니다. 그리고 여지껏 쓰지않았던 fgets를통해 입력값을 받습니다. 먼저 fgets함수의 원형을 보면 char *fgets(char *s, int size, FILE *stream);첫번째 인자로 옮길버퍼두번째로 옮길 사이즈세번째로 파일 포인터입니다 fgets는 보통 특정파일 내용을 읽어들일때 사용하고..
분석 해 봅시다.strcpy의 주소를 addr에 저장하고 save eip위치의 값과 addr을 비교하고 있습니다.여기서 주의할점은 &strcpy는 GOT(=실제 주소)가 아닌 PLT(=참조주소)입니다. 그리고 마지막에 버퍼와 EBP, EIP 공간을 A로 덮고있네요GDB로 살펴봅시다 strcpy의 plt값 입니다. eip위치에 저 값을 넣으면 강제종료가 되지않고 다음으로 넘어갈 수 있습니다. 우선 인자를 채우기 전에 strcpy함수 원형을 보면첫번째 인자로 목적지 주소값이 들어가고두번째 인자로 출발지 주소값이 들어갑니다. 어떤식으로 진행될지 생각을 해 본다면우선 에필로그를 거쳐 strcpy함수쪽으로 점프하게 되고 인자값을 통해 strcpy가 실행될 것이고 또 에필로그가 수행이 될 것입니다. 이제 대략 만들..
음 이번문제는 알고보면 윷놀이와는 전혀 상관이없지만 ㅎ 도개걸윷모 함수가 존재합니다 보시면 알다시피 순서대로 호출을 해야만 함수가 정상적으로 실행이 되고 마지막 모함수에 system함수를 실행할 수 있게됩니다. 또 모 함수에서만 cmd라는 인자를 받아 system 인자로 들어가게 되네요 차근차근 따라가면 풀 수 있는 문제입니다. call을 하지않고 jmp를 이용하여 함수에 접근하기에 기존 eip가 함수에 접근했을 때 eip가 호출함수의 ebp가 되는 성질을 이용하여 풀면 될 것 같습니다. 우선 각각 함수의 시작 주소를 찾고 순서대로 호출할 수 있게 만들어 줍니다 정상적으로 값이 채워진것을 확인 했고 실제 실행을 했을때 모든함수가 호출된 것이 확인됩니다자 이제 인자를 넣어야 system(arg)가 실행이 ..
자 이번에도 문제를 풀어보겠습니다 이번 zombie_assassin는 strncpy를 이용하고있네요 ㅎㅎ전과 같은 방법으로 풀 수는 없을것 같네요근데 정말 친절하게도 FEBP를 이용하라고 합니다. 전에도 FAKE EBP를 이용한 문제가있었는데 이번엔 응용버전이네요기본적으로 FAKE EBP를 이용하려면 에필로그가 두번 실행이 되어야합니다여기선 에필로그가 한번밖에 실행이 안되므로 FAKE EBP를 사용할 수 없습니다그러나 전 문제를 풀어보셨으면 눈치를 채셨을 겁니다eip에 text segment영역중 leave명령어를 호출하면 에필로그가 두번 실행이 될 수 있게 만들 수 있습니다.자 이제 진행해 봅시다. 우선 main문의 leave 주소를 기억해 둡시다 처음 "aaaa" 4바이트는 fake eip가 될 것이..