System Hacking 37

main 함수가 호출, 종료되는 과정(.init_array&.fini_array)

참고 : https://wogh8732.tistory.com/228 https://dreamhack.io/learn/11#8 https://rninche01.tistory.com/entry/Linux-Binary-Execution-Flow 분석 대상 바이너리 : pwnable.xyz의 Dirty Turtle문제 바이너리 fini_array 가 뭔지 알아보려고 위 블로그를 토대로 main함수가 호출, 종료되는 과정을 살펴보았다. 1. ELF 헤더 확인 Entry point(EP) : 코드가 시작될 때 실행이 시작되는 파일, 프로그램의 시작점 또는 그 영역 Entry point 주소를 IDA에서 찾아보면 _start 함수임을 알 수 있다. 프로그램을 실행하면, _start 함수가 맨 처음에 호출이 된다. 2..

System Hacking 2021.06.03

Double Staged FSB

이 문제 풀다가 첨으로 봄 FSB FSB는 스택의 값을 조작하여 원하는 결과가 나타도록 공격하는 방법이다. 지역변수(buffer)가 선언되어 있고, 이 값을 쓰기도 가능하며, 출력도 가능한데, 출력을 할 때 포맷스트링을 지정해주지 않아 발생하는 취약점이다. FSB는 %p 등을 이용하여 스택의 값을 엿볼수도 있고, %n을 이용하여 원하는 스택 위치에 값을 쓰는 것도 가능하다. 보통 exploit을 하려면, 변조하고 싶은 주소(got)를 넣고 해당 값이 나오는 곳에 %n 포맷스트링을 이용하여 실행하고 싶은 주소를 넣는 방법을 쓴다. 하지만 어떤 변수를 printf로 출력을 하는데, 그 변수가 지역변수(buffer)가 아닌 전역변수로 선언이 되었다면 어떻게 될까? (Double Staged FSB) 기존 FS..

System Hacking 2021.05.30

integer overflow 2

코드 출처 : https://lactea.kr/entry/pwnablexyz-l33t-ness-write-up pwnable.xyz 문제 풀다가 integer overflow 개념 조금 더 잡아야할 필요성을 느꼈다. 지난번에 비슷한 주제로 글 쓴 적 있는데 이 포스팅이 더 실용적인 것 같다. signed int -2^31 ~ 2^31-1 –2147483648 ~ 2147483647 unsigned int 0 ~ 2^32-1 0 ~ 4294967295 #include #include int main() { char a[16]; read(0, a, 0x10); int b = atoi(a); printf("%d\n",b); } signed int이다. # 입력 # 출력 2147483647 # int 최대 범위..

System Hacking 2021.05.19

Sigreturn-oriented programming (SROP)

개인적으로.. SROP라고 하면 두개가 생각난다. Syscall ROP Sigreturn-oriented programming... 지금 생각해보니까 둘 다 syscall을 이용하는거니.. 거기서 거기인 것 같은 느낌이 든다. 개요 일반적으로 BOF 취약점이 발견되면, ROP나 RTL 기법을 사용하여 익스를 한다. 하지만... ROP를 하기에 gadget이 부족하다? 이럴 때 Sigterun-oriented programming(SROP) 기법을 사용한다. Sigreturn-oriented programming (SROP) Sigreturn system call을 사용하는 ROP 기법 Sigreturn system call : 시그널을 받은 프로세스가 kernel mode에서 user mode로 복귀할 ..

System Hacking 2021.05.10

Stack Pivoting (스택 피봇팅)

참고 : JSec님 블로그 실습 환경 : ubuntu 18.04 개요 ROP를 하고 싶은데 BOF가 Return address까지 밖에 나지 않을 때 어떻게 해야 할까? Stack pivoting 여러 gadget을 이용해서 쓰기 가능한 공간에 Fake Stack을 구성해놓고 Chaining하는 기법 특정 영역에 값을 쓸 수 있거나 값이 있는 경우 SFP를 이용하여 스택을 옮기고 해당 부분의 코드를 실행하는 기법 Stack pivoting을 하기 위한 전제 조건 페이로드가 저장되어 있는 영역이 존재할 경우, RET까지만 overflow 발생 페이로드가 저장되어 있는 영역이 없는 경우, 입력함수 + leave_ret을 넣을 수 있을 만큼 overflow 발생 두 경우 다 gadget이 존재해야 함 이 글에..

System Hacking 2021.05.03

64bit에서 FSB (Format String Bug) 이해하기 -(3)(완)

참고자료 : JSec님 블로그(blog.naver.com/yjw_sz/221889244689) 64bit FSB 시리즈 : 64bit에서 FSB (Format String Bug) 이해하기 -(1), (2) 32bit FSB 시리즈 : 32bit에서 FSB (Format String Bug) 이해하기 -(1),(2),(3) 지난번에 FSB 취약점을 이용하여 shell함수를 exit@got에 덮어보았다. 오늘은 shell함수가 없다..! * (2)을 보지 않았으면 (2)부터 꼭 보고 (3)번 글을 읽길 바랍니당. system('/bin/sh') system('/bin/sh')는 쉘을 실행하는 시스템 함수이다. 포너블 분야에서는 이 함수를 최종적으로 실행하여 익스플로잇에 성공하게 된다 이 함수를 실행시키기 ..

64bit에서 FSB (Format String Bug) 이해하기 -(2)

참고자료 : JSec님 블로그(blog.naver.com/yjw_sz/221889244689) 64bit FSB 시리즈 : 64bit에서 FSB (Format String Bug) 이해하기 -(1) 32bit FSB 시리즈 : 32bit에서 FSB (Format String Bug) 이해하기 -(1),(2),(3) 지난번에 간단하게.. fSB 취약점을 이용하여 변수의 값을 바꿔보았다. 오늘은 shell함수가 등장한다.. (1)을 보지 않았으면 (1)부터 꼭 보고 (2)번 글을 읽길 바랍니당. PLT와 GOT PLT : 외부 라이브러리 함수를 사용할 수 있도록 주소를 연결해주는 역할을 하는 테이블 GOT : PLT에서 호출하는 resolve 함수를 통해 구한 라이브러리 함수의 절대 주소가 저장되어 있는 테..

64bit에서 FSB (Format String Bug) 이해하기 -(1)

참고자료 : JSec님 블로그(blog.naver.com/yjw_sz/221889244689) 32bit FSB 시리즈 : 32bit에서 FSB (Format String Bug) 이해하기 -(1),(2),(3) 지난 10월... 32bit에서 FSB를 이해했었다. 이제 드디어..! 64bit에서 FSB를 제대로! 이해해보려 한다.(이때까지 문제 푼거는 야매로 문제 푼 것 .. .. ....) 사실 32bit FSB 열심히 공부해놨는데, 정작 문제들은 다 64bit에서의 FSB라서 슬펐다..ㅠ 아무튼~ 시작해 봅시당~ tmi 더보기 초반에는 단순 FSB 개념이기 때문에 32bit에서와 겹친다. 하지만 64bit에서의 특별한 FSB 설명도 있을 수도.. 64bit 함수 호출 규약 함수 호출 규약 : 함수를..

RTC (Return to CSU) (수정)

HackCTF에서 RTC 문제를 풀어보려고 하는데, RTC 기법이 뭔지 잘 몰라서 정리를 해본다.. 개요 64bit ROP를 진행하려면 필요한 gadget들이 있어야 한다. 예를 들면,,, read함수를 실행시킨다고 가정하면,, read함수는 인자가 3개니까 pop rdi, pop, rsi, pop rdx 이렇게 세 인자를 제어하는 가젯이 필요하다. 그런데 가끔 가젯이 모자라거나 없는 경우가 있다. 문제 출제자가 친절해서 저렇게 가젯을 넣어 준 거고.. 필요한 모든 가젯이 바이너리 안에 존재하는 건 드문일이다. 이럴 때 RTC 기법을 쓴다고 한다. RTC (Retrun to CSU) ELF 바이너리는 위 사진과 같이 start → libc_start_main → libc_csu_init → ... → m..

System Hacking 2021.04.19