6회차 회고록
목표
- 보안 공부 - how2heap
결과
first fit
- 주기억장치의 사용 가능한 공간을 탐색하여 첫번쩨로 찾아낸 곳에 할당하는 방식
- 충분한 공간을 찾으면 탐색을 종료한다.
- 가장 간단하며, 대부분의 경우 최적이고 빠르다.
first fit.c
코드
실행 결과
glic는 free chunk를 선택하기 위해 first-fit 알고리즘을 사용합니다. 만약 어떤 chunk가 free되어있고 충분한 크기라면 malloc은 이 chunk를 선택할 것입니다. 이는 UAF 상황에서 exploit될 수 있습니다. 2개의 버퍼를 할당합니다. 두 버퍼는 fastbin이 되지 않게 충분히 커야합니다. 첫 번째 malloc(512): 0x555555757260 두 번째 malloc(256): 0x555555757780 우리는 여기서 malloc을 이어갈 수도 있습니다… 나중에 확인할 수 있도록 문자열을 적어놓읍시다. “This is A!” 첫 번째 malloc 0x555555757260 은 “This is A!” 를 가리키고 있습니다. 첫 번째 malloc을 free합니다…. 우리는 더 이상 free할 필요가 없습니다. 우리가 512보다 작은 사이즈를 할당하면 그건0x555555757260 를 가리키게 될 것입니다. 그러니까, 500 bytes를 한번 할당해 봅시다. 세 번째 malloc(500): 0x555555757260 이제 이 주소에 다른 문자열을 넣어보겠습니다, “This is C!” 세 번째 malloc 0x555555757260은 “This is C!” 를 가리키고 있습니다. 첫 번째 malloc 0x555555757260은 “This is C!” 를 가리키고 있습니다. 첫 번째 malloc 변수는 세 번째 malloc된 chunk를 가리키고 있게 됩니다.
디버깅 : peda-gdb
pdisas main
break point로 확인
- 할당한 직후에 break
- free 전과 free 후에 break
첫번째 malloc 후에 rax를 확인해보면 위와 같다.
x/40xg 0x555555757260-0x10
0x10을 빼주는 것은 malloc후 반환되는 주소가 chunk의 주소가 아니라 data의 주소이기 때문에 header를 보기위함이다.
메모리를 보면 size에 0x521이 들어있는 것을 확인할 수 있다.
이는 0x512(data) + 0x08(header) = 0x520 인데 마지막 1은 prev_inuse_bit이다.
두번째 malloc 후에 rax를 확인해보면 위와 같다.
0x261은 0x256(data) + 0x08 = 0x25e 인데 마지막 1은 prev_inuse_bit이다.
첫번째 malloc을 free하고 다시 메모리를 확인해보면 해당 영역이 freed chunk가 되어 fk와 bk가 생긴 것을 확인할 수 있다.
free한 후 세번째 mallor을 한 뒤 rax를 확인해보면 위와 같다.
세번째 malloc이 첫번째 malloc이 할당되었던 부분을 할당받은 것을 알 수 있다.
gdb 명령어 정리
X 명령어를 사용해 메모리를 조사할 수 있다.
o : 8진법으로 보여줌
x : 16진법으로 보여줌
u : 10진법으로 보여줌
t : 2진법으로 보여줌
b : 1 byte 단위로 보여줌(byte)
h : 2 byte 단위로 보여줌(half word)
w: 4 byte 단위로 보여줌(word) - 난 2byte로 알고 있지만 여기선 4바이트로 쓰이나 보다….
g : 8 byte 단위로 보여줌(giant)
i : 역어셈블된 명령어의 명령 메모리를 볼수 있음
c : ASCII 표의 바이트를 자동으로 볼 수 있다.
s : 문자 데이터의 전체 문자열을 보여준다.
예시
x/o $esp
x/4wx 0xbffff2a0
x/hu $ebp
x/gt $eip
x/i $eip
x/3i $eip
x/3cb 0x8048484
x/s 0x8048484
참고 사이트 : 블로그