Pwnable

Pwnable/LOB

[LOB] 14. GIANT

passcode : one step closer (NO DRAG, NO PASSCODE) bash2. 소스코드를 분석하여 보자. 이 문제에서는 argv[1][47] == '\x40' 인 것으로 보아 0x40xxxxxx 영역을 사용하는 외부 라이브러리 함수의 주소를 RET에 덮는 방식은 사용할 수 없을 것 같다. 또한 argv[1][47] == '\xbf’ 로 보아 shellcode 를 export 하여 그의 주소를 ret에 덮을 수도 없을 것 같다. 그렇다면 RET은 환경변수의 주소도 아니고 라이브러리 함수의 주소도 아니다. 이때 사용하는 것이 RET Sled이다. 또한 함수의 epilogue 는 leave + ret 명령어로 이루어져 있다. 여기서 ret 명령어는 pop eip, jmp eip로 이루어..

Pwnable/LOB

[LOB] 13. BUGBEAR

passcode : new attacker (NO DRAG, NO PASSCODE) 이 문제도 역시 RTL을 사용하는 문제인 것 같다. darkknight 문제와는 다르게 execve 함수를 이용해야 하는 것 같다. 코드에서 ret != execve_addr 이므로 RET을, 즉 argv[1][44]를 execve 함수로 덮어주어야 한다. 여기서 execve 함수는 다음과 같이 사용한다. - execve(const char *filename, char *const argv[], char *const envp[]) payload를 어떻게 구성할지 생각해보자. 우선 main의 RET은 execve의 주소로 덮는다. execve의 RET은 system의 주소로 덮는다. system 함수는 ebp + 8, 즉 ..

Pwnable/LOB

[LOB] 12. DARKKNIGHT

passcode : new attacker (NO DRAG, NO PASSCODE) bash2. 소스코드를 바로 분석해보자. 코드에서 argv[1][47] == '\xbf' 이면 프로세스가 종료되므로 우리가 사용한 일반적인 BOF로는 풀리지 않을 것 같다. 이 문제는 RTL(Rrturn To Library) 기법을 사용하는 문제인 것 같다. 우선 RTL 기법에 대해서 알아보자. RTL을 이해하였다면 이제 바로 문제를 풀어보자. bugbear 프로그램의 메모리 구조와 새로 추가해줄 dummy + parameter 의 구조는 다음과 같다. —————————— High Address | parameter | → "/bin/sh" 문자열의 주소 —————————— | dummy(4) | —————————— | ..

Pwnable/LOB

[LOB] 11. GOLEM

passcode : cup of coffee (NO DRAG, NO PASSCODE) bash2 까먹지 말자. 소스코드부터 분석해 보자. 우선 이전의 문제들과는 다르게 main 함수에서 problem_child 함수를 호출한다. 또한 41bytes만큼을 입력받기 때문에 RET을 우리가 원하는 주소로 변조할 수 없다. 하지만 41bytes를 입력받을 수 있어서 SFP의 마지막 1byte를 변조시킬 수 있다. SFP의 마지막 1byte를 변조시켜 프로그램의 흐름을 뒤바꾸는 기법을 FPO라고 한다. FPO 기법 SFP 영역에서 1byte 변조(오버플로우)가 가능해야 함 main 함수 외에 다른 sub 함수가 있어야 함 SFP의 마지막 1byte를 변조하면 코드의 흐름이 바뀌는 이유는 함수의 프롤로그와 에필로그..

Lucvs
'Pwnable' 카테고리의 글 목록 (7 Page)