Pwnable/LOB

Pwnable/LOB

[LOB] 16. ZOMBIE_ASSASSIN

passcode : no place to hide (NO DRAG, NO PASSCODE) RTL Chaining 애 관련된 문제인 것 같다. RTL Chaining은 기존의 RTL 기법에서 RET + 4 영역을 다음 실행할 함수의 주소로 덮는 방법이다. 이 방법을 연속으로 사용하게 되면 RTL Chaining이 되는 것이다. 여러개의 sub 함수가 존재하고 check 라는 변수의 값이 각 함수를 지나쳐가면서 변화된다. 우선 이 문제를 해결하기 위하여 필요한 조건은 다음과 같다. RET 부분에 DO 함수의 주소를 넣을 것 라이브러리 함수 이용 불가 MO 함수에 system 함수가 있으므로 RTL Chaining 으로 DO 함수에서 MO 함수까지 이동할 것 MO 함수의 인자로 “/bin/sh”를 전달해줄 ..

Pwnable/LOB

[LOB] 15. ASSASSIN

passcode : pushig me away (NO DRAG, NO PASSCODE) 이번 문제는 GIANT 문제의 코드와 비슷하지만 strncpy 함수를 통하여 딱 48바이트만 buffer를 채운다. 따라서 buffer + SFP + RET 이외의 공간은 사용할 수 없다. 그렇다면 buffer에 shellcode를 삽입하고 esp, ebp, eip 레지스터들을 잘 이용하여 쉘이 실행되도록 해야한다. 우선 buffer 안에 shellcode를 집어 넣을 것이므로 buffer는 NOP + shellcode 로 채워줘야겠다. 그리고 마지막에 eip가 buffer의 시작주소에 위치하여야 한다. main 함수의 기본적인 에필로그로는 eip가 buffer의 시작주소에 위치하지 못하기 때문에 에필로그를 한번 더 ..

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, 즉 ..

Lucvs
'Pwnable/LOB' 카테고리의 글 목록 (2 Page)