본문 바로가기

메모장

(7)
원하는 함수의 plt, got주소 찾는법 gdb내에서 info func : 프로그램 내에서 사용된 함수들의 plt, got 주소등을 출력해줌 만약 info func를 했는데도 got를 찾을 수 없다면 objdump -R Hi | grep 함수이름 : 함수의 got주소를 찾을 수 있음 libc에서 offset구하는 방법 objdump -d libc..... | grep 함수이름 : 원하는 함수의 offset을 구할수 있다.
특정 함수의 주소, offset 찾는 방법 gdb-peda에서 필요한 명령 아무곳에나 bp를 걸어준 뒤에 x명령을 이용해서 현재 필요한 함수의 주소를 찾는다. 주소를 찾았다면 뒤에서 2,3번째에 표시된 주소를 저장해둔다. 이걸 주소 1이라 하겠다. ex) 0xf7e5eed0 libc-database 사용되는 명령어들 ldd 파일이름 : 지정된 파일이름에서 사용된 libc의 버전과 주소 등을 출력한다. ./find 함수이름 주소1 : 주소1을 기반으로 함수이름을 찾는다. ./add 사용중인libc의위치 : libc의 종료를 추가한다. ./dump find에서찾은id (찾을함수이름) : id의 offset을 출력한다. +찾을 함수이름을 추가하면 찾을 함수만 출력해준다. base주소 + offset주소 = 실제 함수 주소
프로세스와 스레드_정리 프로그램 ( Program ) ㅡ 어떤 작업을 위해 실행할 수 있는 파일 프로세스 ( Process ) ㅡ 컴퓨터에서 연속적으로 실행되고 있는 컴퓨터 프로그램 ㅡ 메모리에 올라와 실행되고 있는 프로그램의 인스턴스 ( 독릭적인 개체 ) ㅡ 운영체제로부터 시스템 자원을 할당받는 작업의 단위 ㅡ 동적인 개념으로 실행된 프로그램을 의미함 * 인스턴스 : 해당 클래스의 구조로 컴퓨터 저장공간에서 할당된 실체를 의미 스레드 ( Thread ) ㅡ 프로세스 내에서 실행되는 여러 흐름의 단위 ㅡ 프로세스의 특정한 수행 경로 ㅡ 프로세스가 할당받은 자원을 이용하는 실행의 단위 자바 스레드 ( JAVA Thread ) ㅡ 일반 스레드와 거의 차이가 없으며, JVM가 운영체제의 역할을 한다. ㅡ 자바에는 프로세스가 존재하지..
안티 익스플로잇 기술 공부를 하다가 어느 블로그에 들어가게 되었는데 흥미로운 내용이 있어서 적어둔다. ( 나중에 천천히 한번 읽어봐야겠다. ) *) AAAS (ASCII Armored Address Space) AAAS는 굉장히 흥미로운 아이디어다. 아이디어는 라이브러리들을 (일반적으로는 어떤 ET_DYN 오브젝트) 최초 16 MB 주소 공간에 로드하는 것이다. 결과적으로 이 모든 공유라이브러리의 코드와 데이터는 주소의 시작이 NULL로 시작되는 위치에 존재하게 된다. 이것은 자연스럽게 strcpy와 같이 NULL 문자열을 받지 못하는 함수들에 의한 오버플로우 버그들에 대항하게 된다. 이런 방어들은 본질적으로 NULL 바이트 이슈가 없는 (예를들어 Linux/*BSD x86 시스템의 PLT와 같은) 것에 대해서는 효과가 없다..
카나리 ( canary ) 생성방식 일반적으로 네트워크 데몬들은 clone 또는 fork를 통해 새로운 접속에 대해 스레드를 생성 fork의 경우 child process가 execve를 호출 하느냐 안하느냐 2가지 경우로 구분 Using fork : fork 시스템 호출은 프로세스를 복제 = 카나리가 함수 단위로 생성되는 것이 아니라 프로세스 단위로 생성되기 때문에 부모와 자식이 동일한 카나리를 공유 몇번의 시도로 카나리를 추측할 수 있다는 의미 ( 요청할 때마다 동일한 카나리를 가지기 때문 ) 카나리는 총 4바이트이고 terminator 카나리라면 하위 바이트는 0x00으로 고정, 나머지 3바이트를 추측하는 것이기 때문에 최대 255 * 3의 시도로 카나리를 찾을 수 있다( by Ben Hawkes ). Using execve : ex..
gdb 내에서의 명령어 메모 set disassembly-flavor intel 어셈블리 형식을 intel 형식으로 설정 disas [함수명] 함수명을 디스어셈블코드로 출력 ex) disas main b *[브레이크 지점] 브레이크 지점에서 프로그램이 멈추도록 설정 r ( run ) 프로그램 실행 k ( kill ) 프로그램 종료 x 명령어 메모리를 조사 +옵션 o : 8진법으로 보여줌 x : 16진법으로 보여줌 u : 10진법으로 보여줌 t : 2진법으로 보여줌 b : 1 byte 단위로 보여줌(byte) h : 2 byte 단위로 보여줌(half word) w: 4 byte 단위로 보여줌(word) g : 8 byte 단위로 보여줌(giant) i : 역어셈블된 명령어의 명령 메모리를 볼수 있음 c : ASCII 표의 바이트를 ..
objdump 명령어 메모 objdump 명령어 + 옵션 바이너리 덤프 작업, 파일 디스어셈블 작업이 가능하다. 1. 바이너리 덤프 작업 objdump -s 1_1 내가 원하는 섹션만 출력 objdump -j [섹션명] 2. 지정 가능한 오브젝트 파일 형식을 보는 명령어 objdump -i 3. 섹션헤더만 쫙 출력 objdump -h 4. 순수하게 바이너리만 출력 objdump -b 5. 파일 디스어셈블 objdump -d ( 보통 .text섹션 같은 부분만 디스어셈블 모든 섹션을 디스 어셈블하고 싶으면 -D 대문자로 입력 ) 5_1. 파일 디스어셈블 특정 섹션만 디스어셈블 objdump -d -j [섹션명]