# 보호기법
# pseudo code
main 함수 :
flag 함수 :
# process
main 함수의 코드를 따라가서 heap 상태를 확인한다.
v3 값을 1로 만든다고 했으니 1 값을 가지는 부분이 v3 일 것이다. 그럼 v3+1 에 malloc 한 heap의 주소 값을 적으니까 0xbe5030이 두 번째 malloc 한 청크 주소. 바로 뒤의 0x0 + 0x21(size) + data(0x10) 에 해당한다.
그 뒤에 2 값이 적혀있는 부분은 v4 이다. v4 + 1에는 세 번째 malloc한 청크의 주소가 적혀있다.
그리고 바로 뒤에 해당 청크가 있다.
자, 이제 다음 단계를 확인하기 위해 main함수를 다시 보자.
fgets 함수로 변수 s에 0x1000 바이트 입력받고, v3+1에 strcpy 함수로 복사한다.
이때, 할당한 데이터 영역 크기는 0x10바이트뿐인데 0x1000바이트나 복사할 수 있으니 heap overflow가 발생한다.
두 번째 fgets, strcpy 함수로 v4+1에 복사할 때도 마찬가지이다.
근데, 첫 번째 복사 때 아예 세 번째 청크 주소가 적힌 v4+1 값을 원하는 주소로 바꾼다면,
두 번째 strcpy 때 v4+1에 복사할 때는 원하는 값을 원하는 주소에 적을 수 있다.
그럼 v4+1 값을 exit@got로 바꾸고, 두 번째 입력 때 flag 함수 주소를 준다면, exit@got에 flag 함수 주소가 적힌다.
exit(1) 때 flag 함수가 실행될 수 있는 것이다.
v4+1이 두 번째 청크의 데이터 영역으로부터 40바이트 거리이므로 40바이트의 더미를 준 후 exit@got로 payload를 준다.
exit@got가 flag 함수 주소 0x400826으로 덮힌 것을 확인할 수 있다.
[picoCTF 2018] echooo (0) | 2020.01.29 |
---|---|
[TUCTF 2018] Ehh (0) | 2020.01.29 |
[HITCON-Training] lab14 : magicheap (0) | 2020.01.12 |
[Insomni'hack 2017] Wheel of Robots (0) | 2020.01.10 |
[HITCON 2016] SleepyHolder (0) | 2020.01.08 |