본문 바로가기

전체 글

(156)
[Dreamhack] PIE & RELRO - 티스토리 먼저 PIE는 Position - Independent Executable의 약자로 위치 독립적인 실행 파일이란 뜻이다 즉, 무작위 주소에 매핑되어도 실행 가능한 파일이란 말이다 -> 공유 오브젝프 파일의 파일 형태를 가짐 PIC는 Position - Independent Code의 약자로서 위치 독립적인 코드이다 즉, 어느 주소에 있어도 의미가 훼손 되지 않는 코드이며 PIE는 PIC이다 PIC는 무작위 주소에 매핑 되므로 주소를 참조할 때 상대주소 (rip을 기준으로 거리 계산 값)를 사용해서 주소를 참조하고 PIC가 아닌 코드는 절대주소 (해당 값의 메모리 내 절대적인 주소 값)을 직접 참조해서 사용한다 pic 예제 코드 pic가 적용되지 않은 코드이다 %s 문자열을 참조할 때 '0x4005a1'이..
[드림핵] fho 풀이 - 티스토리 PIE가 적용된 바이너리를 대상으로 실습하도록 설계된 문제이다 그동안 배운 보호기법들이 전부 적용된 모습을 볼 수 있다 코드를 살펴보면 buf에서 BOF가 발생하고 이를 통해 원하는 값을 얻을 수 있다 또한 addr과 value의 관계를 보면 addr에 들어간 주소가 가리키는 값에 value에 입력 받은 값을 넣어주고 있다 문제 자체가 hook-overwrite하는 문제이므로 adrr에 __free_hook의 주소 값을 넣고 value에 system주소 값을 넣는 것으로 추측 가능하다 마지막에 addr에 한 번 더 입력 받고 있다 이미 __free_hook변수가 가리키는 값은 바꼈으므로 addr에 인자를 전달해주면 된다 여기서 addr에 /bin/sh의 주소값을 넣어주면 free인자로 addr이 오고 있..
[드림핵] basic_rop_x86 풀이 - 티스토리 basic_rop_x64와 서버 환경만 다르고 나머진 거의 유사한 문제이다 코드 정적 분석 1. buf 입력 시 BOF 발생 2. puts함수 plt로 read함수 주소 릭 3. system, /bin/sh주소 구한 후 ret overwrite -> ret2main 이용 코드 동적 분석 이전 문제와 달리 buf와 ebp 중간에 더미값 4바이트 있음 필요한 정보들 32비트 환경에서 함수 인자 전달할 때 레지스터가 아니라 스택을 이용하므로 rop chain을 만들어주려면 스택을 정리해며 다음 함수로 연결해줄 가젯이 필요하다 puts와 system은 인자를 하나 사용하므로 pop (레지스터) ; ret 가젯이면 충분하다 read주소 출력 및 write함수가 출력하는 값 날리기 read함수 주소 릭 후 libc..
[드림핵] basic_rop_x64 풀이 - 티스토리 rop문제이고 64비트 환경이다 카나리는 없고 NX와 ASLR만 켜져 있는 상태이다 풀이 가능한 방법 1. ret2main (main함수 재호출) 2. got overwrite (got주소에 system주소 덮어서 해당 함수 재호출 -> main함수 재호출 x) 3. RTC (Return to CSU, 나중에 정리해야겠다) (대충 main함수를 실행하기 전 코드의 코드 조각들을 이용하는 기법) 코드 정적 분석 1. buf입력 시 BOF 발생 2. 첫 입력에서 사용 가능한 plt, got값 - read_got - read_plt - puts_got - puts_plt - write_plt 3. read함수와 puts이용해서 libc주소 릭 가능 4. 입력을 한 번만 받으므로 ret2main이용해서 main..
[드림핵] rop (return oriented programming) 풀이 - 티스토리 리턴 가젯과 Got overwrite을 이용해 푸는 문제이다 코드를 보면 buf에서 BOF가 발생한다. 코드 내 특정 함수에 got값에 system함수 주소를 overwrite하는 방법으로 풀이를 정리해보겠다 원래 puts함수에 got값을 overwrite하려 했으나 우분투 새 버전 부터 뭐가 바껴서 puts으로는 안 된다는 댓글을 봄.. write함수 이용 ** 필요한 것들 1. 카나리 -> 생략 2. system 주소 -> libc주소와 libc내 system의 offset을 이용 3. libc 주소 -> 코드 내 함수들의 got, plt 값을 이용 4. 필요한 가젯들 *시나리오* - 카나리 릭 -> buf에 특정값 대입 - libc주소 -> read의 got값을 인자로 write 함수의 plt 값을..
[드림핵] Return to Library 풀이 - 티스토리 ASLR, NX, Canary 모두 켜져 있다 1. 코드 분석 - buf의 크기가 0x30인데 0x100 크기로 두 번의 입력을 받고 있다 -> 카나리릭과 Overwrite이 가능함 - 코드 내에 system함수가 호출되고 있다 -> system의 plt값을 이용해서 재호출 가능 (plt값은 ASLR이 켜져 있어도 안 바뀜) - 코드 내에 "/bin/sh"이 전역 변수로 선언 돼 있다 -> 해당 문자열을 사용가능 (ASLR 기능이 켜져 있어도 코드 영역은 그대로) 2. 페이로드 시나리오 - 첫 번째 입력에서 카나리 릭, 두 번째 입력에서 ret overwrite을 시킨다. 이 때 plt의 system 주소로 overwrite 시켜야 함 3. 페이로드 작성 시 필요한 것들 1) plt에서 system함수의..
[드림핵] ssp_001 풀이 - 티스토리 canary 문제이다 해당 명령어로 적용된 보호기법 확인이 가능하다 NX도 켜져있으므로 쉘코드 사용불가 -> 문제 내 함수 이용 처음 코드 본 순간 어지러웠다. 포너블 공부하면서 본 코드 중 제일 길었다 코드 보고 예상한 스택 상태는 이거였다 gdb 뜯어본 결과 이런 상태였다 name이랑 box위치가 다르다.. *코드분석 : 1. print해주는 부분이 P 입력 했을 때 밖에 없으므로 P 입력 후 카나리 릭 가능 2. E 입력 시 name의 길이를 사용자가 지정 가능하므로 BOF 발생 3. get_shell함수 주소를 ret에 덮어 씌우면 끝 페이로드 : 새롭게 알게 된 것들 1. 변수를 선언해줄 경우 canary = b''와 같은 형태로 선언해줌 2. 바이트 코드 형태를 사용하므로 정수 입력 시 str..
[드림핵] Return to Shellcode 풀이 - 티스토리 문제 코드이다 대충 보자면 buf를 입력 받는 부분에서 BOF가 발생하고, 이를 통해 카나리 릭을 하여 ret에 buf주소를 덮어씌워 쉘 코드를 실행 시키면 된다 지금까지 배운 것들에 점점 살이 더 덮여지는 느낌이라 문제 자체는 어렵지 않고 배운 개념을 확인하기에 좋은 문제였다고 생각한다! 실행결과 buf 주소는 출력하고 있으므로 따로 구하지 않아도 된다 또한 buf와 rbp의 거리도 출력해주고 있다 gdb로 뜯어본 내용을 살펴보면 함수의 앞부분에서 fs레지스터에 랜덤으로 배정된 값을 rbp - 8인 카나리가 있는 주소에 저장 시켜주고 있다 또한 함수의 마지막 부분에서 카나리에 저장된 값과 fs레지스터 (초기 카나리 값을 랜덤 배정해둔 곳)의 값과 비교해서 같은 같이면 정상 진행하고 다른 값이면 지정된 ..