오늘 포스팅은 FSOP의 공격 기법 중 glibc 2.23이하의 버전에서만 적용 가능한 House of orange 기법을 살펴보겠습니다.
해당 기법은 free함수가 주어지지 않은 상황에서 topchunk까지 오버플로가 발생할때 사용 가능한 기법으로, Top Chunk의 크기를 조작하여 강제로 힙 관리자가(sysmalloc) 메모리를 해제하게 만들고, 이를 통해 Unsorted Bin Attack과 FSOP로 연결하여 쉘을 따는 방식입니다. 순서를 적어보자면
1. Top Chunk Size 변조 -> malloc 호출 -> 강제 free 유발
2. Unsorted Bin Attack -> _IO_list_all 탈취
3. Fake _IO_FILE&vtable -> 코드 실행
와 같은 흐름으로 이어갑니다.
예제 코드를 만들고 디버거로 확인을 하려고 우분투 16.04 버전이랑 glibc 2.23버전 환경 구성을 도커파일로 하려고 했는데 좀 문제가 발생해서 도커파일이 만들어지지가 않더라고요 ㅜ
그래서 glibc버전을 따로 다운 받고 patchelf로 구버전을 붙여보려고 하였으나 그것도 다음과 같은 에러가 떠서 실패를 했습니다.

현재 사용중인 리눅스 버전이 glibc 2.34 이상의 버전을 사용해서 오류가 나네요.
결국 실제 ctf에 출제되었던 문제를 풀이해보면서 공부를 해보는것으로 하겠습니다.
house_of_orange기법이 처음으로 등장한 문제로 hitcon 2016에 출제된 문제라고 합니다.
문제 파일을 다운로드 받은 뒤 보호 옵션을 확인해보았습니다

소스코드를 확인해보겠습니다.
IDA로 확인한 메뉴입니다.


일단 처음 키면 다음과 같은 메뉴창이 뜹니다.
저희가 하려는게 일단 문제 접근 방식을 공부하려는게 아닌 FSOP에 대해 공부를 하려는 것이기 때문에 write-up을 따로 찾아보았습니다
일단 해당 문제의 특징은 다른 힙 익스플로잇과 다르게 free()함수가 존재하지 않다는 것입니다.
메뉴 구성은 다음과 같습니다.
- Build the house : malloc을 사용하여 구조체를 할당하고 데이터를 씀
- See the house : 할당된 데이터를 출력 ( Leak용도 )
- Upgrade the house : 기존 할당된 데이터의 내용 수정
- Give up : 종료
문제에서 취약점 발생 지점은 다음과 같습니다.

해당 코드는 upgrade the house의 소스코드인데, 사용자에게 새로운 이름의 길이를 입력받지만, 기존에 할당된 name 버퍼의 크기를 확인하거나 realloc을 하지 않기 때문에, 처음 build시 작은 크기로 할당했더라도 Upgrade로 4096바이트를 입력하면 힙 뒤쪽의 데이터를 덮어쓸 수 있습니다.
익스플로잇 절차는 다음과 같습니다.
- Top Chunk 덮어쓰기 : Build로 작은 청크를 할당한 뒤 Upgrade로 힙 오버플로우를 일으켜, Top Chunk의 size 데이터를 조작합니다. Top chunk의 크기를 현재 힙 페이지보다 작게 줄입니다.
- _int_free 유도 : 다시 Build를 호출하여 조작된 top chunk의 크기보다 더 큰 메모리를 요청합니다. 이때 sysmalloc은 Top chunk에 공간이 부족하다고 판단해 힙을 확장하는데, 해당 과정에서 Top chunk는 _int_free를 통해 해제되어 Unsorted Bin에 들어갑니다(free)
- Unsorted Bin 에 들어간 청크는 fd, bk 포인터로 main_arena + 88 영역을 가르키게 됩니다. 다시 Build를 통해 이 영역의 일부를 재할당받고, See the house를 통해 데이터를 출력해 Libc 주소를 leak할수 있습니다.
- 다시 upgrade를 통해 힙 오버플로우를 일으킵니다. Unsorted bin에 있는 청크의 bk 포인터를 조작하여 Unsorted Bin Attack을 수행하는데 이때의 타겟은 _IO_list_all입니다.
- _IO_list_all을 우리가 제어하는 힙 청크(fake _IO_FILE 구조체)를 가르키게 만들고 vtable을 조작하여 에러 메세지 출력 등 내부적으로 IO함수가 호출될 때 system("/bin/sh"가 실행되게 만듭니다.
일단 디버거를 붙여서 실행해보겠습니다.

먼저 ASLR을 끄는 옵션을 켜준뒤 취약점 발생 지점에 브레이크 포인트를 걸어줍니다/
그리고 프로그램을 시작한 뒤

다음과 입력을 했고 힙 청크를 확인해보겠습니다
vis-heap-chunks

얻을 수 있는 정보는 다음과 같습니다.
1. 메모리 덤프를 보면 0x42b0의 마지막 부분에 0x31(청크 크기)가 보이고 그 뒤 문자에 test name이라는 저희가 입력한 값이 보입니다.
2. 맨 아래 0x..4300 부분의 마지막에 20d01이라는 숫자가 보이는데, 해당 숫자는 Top Chunk의 Size필드라고 합니다 이 필드는 정확히 0x555555604308에 존재합니다.
저희가 입력한 문자는 test name이고 42c0에 존재하고 여기서 오버플로우를 일으키면 Top Chunk의 헤더의 사이즈 값을 덮을 수 있습니다.

저희가 덮을 문자는 20d01을 덮으면 되는것이고 Upgrade함수를 통해 긴 데이터를 입력하면 덮어써지게 됩니다.
여기서 제일 중요한점은 Top chunk의 크기를 덮을때는 TopChunk가 끝나는 지점이 페이지 경계선인 0x1000 단위어야 된다는 점을 꼭 확인을 해야합니다.
저희가 20d01이라는 값을 아무 숫자로나 덮어쓰는것이 아니라 Top chunk가 끝나는 지점이 0x5000으로 맞아떨어지게끔 작성을 해야합니다.
(*기존의 20d01이라는 값이 들어가면 Top Chunk가 끝나는 값은 0x555555625000으로 0x1000단위로 맞아 떨어집니다)

vmmap으로 확인해보면 힙의 끝이 62500으로 설정되있는 것을 확인할 수 있습니다.
계산해보면 0xd01을 덮어쓰면 되는 걸 확인할 수 있고 우리가 할당받은 청크의 주소에서 top chunk size필드까지의 거리를 계산하면 오버플로우 페이로드를 작성할 수 있습니다.
Top Chunk size 필드(목표 지점)은 0x555555603408이고 시작 지점은 0x5555556042c0이므로 버퍼를 0x48만큼 붙인 뒤 입력을 하면 됩니다.
payload = b"A" * 72 + p64(0xd01)
위와 같이 페이로드를 작성하면 청크 사이즈를 덮을 수 있습니다.
gdb에서 set명령어를 통해 값을 바꿔주었습니다.

그 뒤에 다시 할당요청을 보내고 d01보다 큰 값인 4000을 넣고 다시 할당했습니다.

그 뒤에 see라는 옵션으로 출력을 했는데 라이브러리 릭이 안되더라고요
그래서 bins 명령어로 sysmalloc이 입력 됐는지 확인을 해보았습니다.

저희가 아까 확인했던 Top chunk주소값이 unsortedbin에 들어가있는걸 보니 free는 성공적으로 된 것 같습니다.
그 후 라이브러리 릭이 잘 진행이 안되서 혼자 이것저것 해봤습니다.
Build -> set으로 top chunk size 덮어쓰기 -> build(size 4000이상) -> build(16바이트) -> see the house 이런 순서로 진행하니까 house 이름 뒤에 무언가 leak이 되고있습니다.

일단 여태까지 한 방법 그대로 익스를 여러번 작성해봤고

이상하게 pwntools로 작성하면 잘 맞춘거 같아도 익스가 터지더라고요 ㅜ
이런식으로 코드를 작성해준 뒤 확인을 해보니까

이런식으로 나오긴 하는데 문자가 좀 짤려서
build(16, b"Leak_Chunk", 1, 1)
여기 Leak_Chunk를 AAAAAAAA로 바꿔준 뒤 Send해줬습니다

이런식으로 더 leak이가능했고 근데 leak된 값이 조금 이상해서 중간에 gdb attach를 추가해주고 bins를 보니까

로 뜨더라고요

확인해보니까 올바른 값이라고 합니다.
근데 어제 컴퓨터로 할때는 7f로 시작하는 주소로 나왔는데 오늘 노트북으로 하니까 aslr끄는 설정이 달랐던 건지 주소가 엄청 낮게 뜨네요

vmmap으로 봤을때도 주소값은 잘 leak 된 것 같습니다.
여기까지가 일단 라이브러리릭까지 성공을 했고요, 추가로 fsop와 같은 공격 기법을 실행 하기 위해 링커랑 라이브러리 파일을 추가로 다운로드 받아서 링크를 다시 해줬습니다.
patchelf --set-interpreter ./ld-2.23.so ./houseoforange
patchelf --replace-needed libc.so.6 ./libc-2.23.so ./houseoforange
ldd ./houseoforang

일단 이렇게 성공적으로 링킹이 됐습니다.
여태까지 처음에 이것저것 해볼때는 다 안됐는데 파일 자체를 복사해서 같은 디렉토리에 넣고 하니까 잘 되는것 같더라고요
일단 libc버전이 바껴서 익스플로잇에 넣을 값을 다시 구해줬습니다. 다시 디버깅을 해서
해당 값으로 바꿨습니다.
이러면 라이브러리 릭을 통해 라이브러리 베이스 주소값을 구할 수 있고, FSOP 공격 전 세팅은 완료 된 듯 합니다.
이제 Unsorted Bin Attack이랑 FSOP를 연계해서 쉘을 따야합니다.
둘 다 해본적이 없는 공격기법이기 때문에 정리를 좀 해봐야 할 것 같은데, Unsorted bin attack에 대해서 먼저 알아보겠습니다.
해당 기법은 내가 원하는 주소(Target)에 'Unsorted Bin'의 주소라는 아주 큰 숫자를 덮어 쓰는 공격입니다.

제가 예전에 쓴 글에서 스크린샷을 가져왔는데 unsorted bin은 이중 연결 리스트의 형태입니다.
즉 bk와 fd를 통해 이전/이후의 청크들과 연결이 되어있고, malloc에 의해 해당 청크가 할당될 경우 bk와 fd를 연결해줍니다.

glibc2.23버전의 malloc소스코드를 확인해 보았습니다.

(*glibc 2.29버전부터는 double check 로직이 추가되어 사용 불가능한 공격입니다)
위의 두 줄 코드를 보시면 unsorted list에서 꺼낼 때 검증 없이 bck->fd 위치에 Main Arena 주소를 덮어씁니다.
저희가 작성하는 익스플로잇과 관련지어서 설명을 해보면, 일단 먼저 해야할 건 저희가 upgrade라는 옵션을 통해 아까 unsorted bin에 넣은 함수에서 오버플로우를 발생시켜야 합니다.
# upgrade(len(payload), payload, ...) 실행 시 전송된 데이터 구조
payload = b"A" * 16 # [1] 현재 청크 채우기 (Overflow용)
+ b"/bin/sh\x00" # [2] victim의 prev_size (나중에 "/bin/sh" 문자열로 씀)
+ p64(0x61) # [3] victim의 size (Small Bin으로 위장)
+ p64(0) # [4] victim의 fd (사용 안 함)
+ p64(io_list_all - 0x10)# [5] victim의 bk (Unsorted Bin Attack 조준!)
+ p64(0) # [6] victim의 _IO_write_base (FSOP 조건)
+ p64(1) # [7] victim의 _IO_write_ptr (FSOP 조건)
+ ... (패딩) ...
+ p64(fake_vtable_addr) # [8] victim의 vtable 포인터 (FSOP 실행)
+ ... (fake vtable) ... # [9] 실제 vtable 내용 (system 함수 주소)
아마 위와같이 fake vtable을 만들 것 입니다.
fsop의 구libc버전은 _IO_FILE_plus의 vtable자체를 바꿔치기 때문에 유효한 공격입니다.
여기서 payload의 5번째줄 보시면 io_list_all을 설정하는데 이건 bk의 위치에다가 해당 주소값을 넣는 과정입니다(-0x10으로 설정하는 건 C언어의 내부 구조체 접근 방식때문입니다.)
여기서 IO_list_all이 뭔지 헷갈려서 찾아보았습니다
_IO_list_all은 쉽게 생각해서 _IO_FILE_plus를 가르키는 포인터입니다.
시스템이 종료되거나 abort될 때 프로그램이 죽기 전에 _IO_list_all을 보고 chain을 돌면서 순회합니다.(_IO_FILE_구조체 chain을 따라가면 stderr가 있음)
이 때 Unsorted Bin어택을 통해 _IO_list_all을 통해 Main Arena로 가게 되고 그 Main Arena에서 다음 _chain에서 저희가 조작한 힙 청크로 가고 그 뒤에 가짜 힙 청크에서 가짜 vtable을 실행하게 되어 쉘 획득으로 가게 됩니다.
_IO_list_all에 대해 더 살펴보기 위해서 구조체 정보를 찾아보겠습니다.

심볼 정보가 안나오더라고요
그래서 libc버전 베이스는 알고있으니 직접 libc에서 검색해봤습니다.

crc버전 불일치 문제라는데 all-in-one 으로 libc를 다운로드받으면 생기는 문제라고 합니다.

바이너리 밖에서 파이썬 pwntools를 통해 뽑아주고 vmmap에서 시작 주소를 확인한 뒤 더해서 그 위치를 확인해봤습니다.

해당 상태는 익스플로잇 전 정상적인 단계로 _IO_list_all 뒤에 바로 stderr구조체가 이어져 있음을 나타냅니다.
지금 _IO_list_all라는 포인터가 0x00007ffff7dd2540으로 stderr의 주소를 가르키지만 이제 저 주소를 덮어써서 Main Arena를 가르키게 조작해야합니다.
이제 페이로드를 한번 작성해보겠습니다.
일단 타겟의 힙 주소를 알아야합니다. 지금 aslr을 꺼둔 상태이므로 아까 작성한 페이로드의 마지막에 디버거를 붙여서 확인했습니다.

타겟주소가 0x555555606110인걸 확인했습니다.
#이제부터 unsorted bin attack
libc.address = libc_base
system = libc.sym['system']
io_list_all = libc.sym['_IO_list_all']
heap_addr = 0x555555606110
payload를 작성해보겠습니다.
일단 저희가 입력하는 힙이랑 0x6110까지의 오버플로우를 일으키기 위해 A를 48번만큼 입력해줘야 합니다.
해당 값은 x/gx로 메모리 주소에 들어가는 값을 확인하면서 맞췄습니다.

해당 위치에 /bin/sh\x00를 넣고, 0x61은 청크의 size로 small bin으로 위장하기 위해 0x61의 사이즈로 설정해줍니다.
fd값은 필요 없으니 0으로 넣고 bk값에는 저희가 공격하고 싶은 위치인 IO_list_all을 넣습니다.
그 아래는 write_base/write_ptr을 넣고 base값보다 ptr값을 높게 해야 _IO_overflow를 유도할 수 있습니다.
일단 이렇게 작성을 했는데 .. 너무 안되서 계속 확인하면서 해봤습니다.
size필드랑 fd필더를 채운 뒤
목표를 설정합니다.
0xc0까지 0으로 채운 뒤 해당 위치에 있는 _mode라는 변수에 0값을 채웁니다.
이후에도 0xd8까지 패딩을 넣습니다.
0xd8에는 _IO_FILE_plus 구조체의 마지막 멤버인 vtable 포인터가 위치한 곳입니다.
fake vtable을 만들어서 하고싶은 건 vtable의 _IO_overflow(offset 0x18)자리에 system함수를 넣는 것입니다.

최종적으로
payload = overflow + fake_file + fake_vtable
이렇게 진행을 하면 abort하는 과정에서 제가 만든 힙 주소로 들어가고 거기서 _overflow가 실행되면서 셸이 획득이 되야하는데..

이런 오류가 계속 뜨더라고요 ..
일단 현재 상태를 체크해보겠습니다.


6110에 값은 제대로 들어가있는 것 같습니다.
abort함수에 브레이크 포인트를 걸고 내부로 들어가서 저희가 만든 가짜 vtable을 참고하는 지 확인해보겠습니다.


call하는 부분이 나올때까지 ni를 눌러주면서 확인했습니다.

일단 _IO_list_all이 가르키는 위치를 확인해보았을 때, 기존처럼 stderr를 가르키는것이아닌 b78로 끝나는 주소를 가르킨다는 것은 unsorted bin attack 이 성공했음을 의미합니다.. 그나마 희소식이네요
함수 안쪽으로 들어와서 Call 명령어를 찾아줬습니다.

call되는 함수가 main arena의 주소는 맞는데 엉뚱한 주소를 가르키고 있습니다.

일단 0x155555328b788 주소가 Main arena + 88주소로 탑청크주소를 담고 있는 포인터 주소입니다.
IO_list_all이 가르키게 되는 주소가 Main arena+88입니다.
여기서 프로그램은 Main arena + 88 주소를 _IO_FILE 구조체의 시작 주소로 착각하고, 다음 파일을 찾을 때 _IO_file의 chain값인 fp + 0x68을 계산해서 찾게됩니다.
이 주소는 0x155555328b78 + 0x68 = 0x155555328be0이고 small bin 7번영역에 위치하게 됩니다.
근데 저희가 넣은 주소는 small bin 6번 영역에 존재하고 있기 때문에 chain이 연결되지 않습니다.
또한 main_arena + 88에 해당하는 값이 fp->_mode <= 0이고 fp->_IO_write_ptr > fp->_IO_write_base라는 조건을 우연하게 통과하는 바람에 bin 6번에 해당하는 값이 실행되지 않고 vtable 실행을 시도해 c38로 호출이 된다고 하는ㄷ ㅔ..
흠 .. 일단 fake file에 넣은 size값을 조정해서 7번 bin 영역에 들어가게 조정을 해야할 것 같습니다.
size값을 71로 수정했습니다.

저희가 원하는 값에 주소가 삽입된 걸 확인했습니다.
그런데도 불구하고 저희가 만든 fake vtable로 흐름이 안넘어가서

함수의 죽은 위치를 확인해보았습니다.
Main_arena가 실행 조건을 만족해서 페이로드가 진행이 안되기 때문에 힙 정렬을 바꿔서 시도해보겠습니다.
처음에 청크할당을 새로 해줬고 그에따라 힙 주소랑 힙 정렬도 다시 해줬습니다.

내부 로직중에 house 개수를 검사하는 로직이 있었던 것 같긴한데.. 개어지럽네요
다른 익스플로잇 코드를 이것저것 찾아보다가 성공한게 있어서 가져왔습니다.
https://www.lazenca.net/pages/viewpage.action?pageId=7536648
House of Orange[KR] - TechNote - Lazenca.0x0
Excuse the ads! We need some help to keep our site up. List Information Description Source Code Write up File information autolycos@ubuntu:~/CTF/HITCON/houseoforange$ file ./houseoforange_22785bece84189e632567da38e4be0e0c4bb1682 ./houseoforange_22785bece84
www.lazenca.net
위의 주소에 있는 코드를 가져와서 제 환경에 맞춰서 경로만 수정을 해줬습니다.

제 익스 작성하는게 너무 안되서 익스에 성공한 코드를 디버깅하면서 분석해보겠습니다.

마찬가지로 abort에 브레이크 포인트를 걸고 분석해줬습니다.




근데 이게 디버거로 붙이고 abort에 브레이크포인트 걸고 시도를 하면 쉘 획득이 안되고, 디버거를 붙여도 바로 나가면 쉘 획득이 됩니다. 어디서 어떤 구조때문에 안되는건지 모르겠는데.. 또 ASLR을 끄고 실행하면 디버거 여부에 상관 없이 쉘 획득이 안됩니다.
제 원래 익스 코드도 aslr끄고 하드코딩한 힙 주소를 동적으로 넣는 방식으로 수정해보겠습니다
근데 아까 익스플로잇에 성공한 코드랑 비교하면서 디버깅을 했습니다.


코드는 거의 비슷하게 작성했는데 see the house 를 했을 때 제 코드에서는 Name Of house랑 price of orange사이에 아무것도 leak 이 안되는데 익스에 성공한 코드는 그 사이에 힙 주소가 leak이 됩니다.
쉘 획득에 성공한 익스플로잇을 참고해서
와 같이 새로운 편의함수를 만들고
이렇게 시도 했는데도 leak이안되네요
공부 순서가 잘못되었다는 생각이 듭니다.
힙 주소 누출하는 과정먼저 공부를 했어야 되는데 그냥 aslr을 꺼버리고 시도를 했더니 이러한 난관이 있을 줄 몰랐네요,
보내는 B값을 하나 늘리고 코드 로직을 조금 수정했습니다.

정말 다행히도 heap leak은 잘 되는 것 같습니다.
이제 payload 나머지 부분을 수정해보겠습니다.
하다보니까 수정할 사항이 너무 많아서 적으면서 하지는 못했는데,일단 libc address가 틀린 상태였어서 수정하면서 바꿔줬습니다.
근데 어제 gdb로할때는 libc어드레스도 다 맞추고 unsortedbin attack까지 성공한걸 다 확인했었는데 왜 이제 다른값인지 모르겠네요 .. aslr을 끄는 옵션때문에 값이 달랐던 것 같기도 합니다.
베이스 주소를 바탕으로

unsorted bin attack까지 성공했습니다.
system이나 IO_list_all 위치까지 성공적으로 맞췄습니다.
이제 payload의 오프셋만 맞추면서 진행을 하면 될 것 같네요

청크를 smallbins에 넣는 것 까지 성공했습니다.
이제야 진짜 FSOP가 시작된 느낌이네요..허허
약 하루넘게 복습하면서 공부하고 복습한 결과 구조를 이해 했습니다.
처음에 heap leak하는게 이해가 잘 안됐었는데, build로 처음에 fd포인터에 있는 libc주소를 leak하고 그 다음 upgrade로 청크 크기를 그대로 유지하면서 기존 잔재인 heap 주소를 leak하는 구조였네요.
해당 주소는 large안에 있을 때 포인터로 남아있던 구조입니다.


large bin의 구조는 다음과 같습니다.

여기서 fd_nextsize라는 값을 힙 주소 leak에 사용한 것입니다.
unsorted bin에 있었다가 malloc으로 호출되기 전 large bin에 잠깐 들어갔다 나오면서 생긴 흔적입니다.
여기서 heap까지의 offset을 구하면


0x130의 값이 나오는 걸 확인할 수 있습니다 (leaked heap raw - heap base)
해당 오프셋은 일정한 오프셋이기 때문에 payload에 넣어주면 heap base를 구할 수 있습니다.
old top chunk도 마찬가지로

랑 leaked heap raw값을 통해서 계산할 수 있습니다.
이렇게 나오네요.

값이 일치하는걸 확인할 수 있었습니다.
다음은 upgrade로 오버플로우를 일으켜서 old top chunk의 주소에 fake 파일 구조체를 만드는 부분입니다.
일단 저희가 leak한 힙 주소는 할당된 힙 주소에서 쓰기 영역까지 채워야함으로 0x430 - 0x10을 계산해서 더미값을 채웁니다.
그 다음은 FSOP부분인데,

주석에 자세하게 적어뒀는데 힙 청크를 할당해두고 내용을 적으면, heap allocater에서 해석하는 내용과 FILE구조체로써 해석하는 내용이 다릅니다.
처음에 이 개념이 이해가 안되서 좀 많이 해맸던 것 같네요
여기서 bk에 _IO_list_all - 0x10을 넣는 이유는 fd 필드가 정확히 _IO_list_all변수 위치에 덮어쓰이도록 해 glibc가 bck_fd=victim 할 때 _IO_list_all에 저희의 fake chunk가 써지도록 하기 위해서입니다.
이어서

overflow함수를 호출하기 위해 _IO_wrtie_ptr과 write_end값에 3,2를 채운 뒤 vtable 포인터까지 패딩으로 채웁니다.
vtable값은 여태까지 작성한 stream의 길이만큼 oldtopchunk에서 더해서 구합니다.
그 뒤 fake vtable을 작성해주면 되는데

vtable은 libc버전에 맞춰서 패딩을 넣어주면 되는데 보통 overflow함수는 4번째줄에 위치합니다.

저는 처음에 p64(system)이랑 p64(2)위치가 반대였는데 디버깅하다보니 이상한 곳에서 죽어서 오프셋을 바꾸다 보니 성공했습니다.
이렇게 가짜 구조체를 완성하고 나면 Upgrade로 오버플로우를 일으키고 덮어쓴 뒤 다시 청크를 할당하면 malloc을 할당하는 과정에서 abort가 발생하고 abort -> IO_list_all -> fake vtable로 타고타고 가게 됩니다.

이렇게해서 house_of_orange가 완성이 되었습니다. 전체 페이로드는 아래 첨부하겠습니다.
농담이 아니고 진짜 문제 write-up 포스팅 작성하는데만 3일 이상이 걸린 것 같습니다.
며칠동안 카공을 했는데 하루에 7시간넘게 앉아서 코드만 보고 있었던 것 같네요.
너무너무 어려웠지만 그동안 익숙하지 않았던 gdb사용에 좀 익숙해진 것 같고, 힙 익스플로잇에 대해 좀 이해한 것 같은 기분이 듭니다.
저야 익스플로잇을 전부 찾아보면서 힘들게 했지만 이걸 대회에서 푸신분들은 어떻게 풀었나 하는 생각이 드네요
다른 exploit이랑 offset도 조금씩 차이가 나는 것 같은데 왜 차이가 발생하는지는 잘 모르겠습니다.
아무도 안읽는 제 익스플로잇 코드지만 너무나도 뿌듯하고 기분이 좋네요..
읽어주셨다면 감사합니다 오랜만에 제리짤 올리겠습니다

PS. 어디선가 블로그 작성을 할 땐 겪은 어려움과 해결 과정을 자세히 적으라는 글을 봤어서 익스 과정을 쭉 적었는데 글이 너무 난잡한 듯한 느낌이 드네요.. 다음부턴 좀 짧고 간결하게 적겠습니다..
'문제 풀이 > Write-up' 카테고리의 다른 글
| [Write-up]SECCON 2022 Quals babyfile write-up - 2 (0) | 2025.12.30 |
|---|---|
| [Write-up]SECCON 2022 Quals babyfile write-up - 1 (2) | 2025.12.23 |
| [Write-up] basic_rop_x64 write-up (0) | 2025.10.04 |
| [Write-up] Captain-Hook Write up (frida Hooking ③) (3) | 2025.07.14 |