cgy12306
Codegate 2017 Angrybird 본문
바이너리를 IDA로 열어서 그래프로 보면 아래와 같이 많은 루틴들이 있는걸 볼 수 있다.
우선 실행시켜보자.
아무런 응답이 없다.
그 이유는 스택 카나리 값을 rax에 넣고, 자기자신과 xor 연산한 다음 0이면 exit 하는 함수로 보내버리기 때문이다.
우리가 도착해야 할 지점은 0x404FAB이다.
하지만 exit로 바로 빠져나가기 때문에 hex editor로 코드를 변조해야 할 듯 하다.
jz _exit를 nop(0x90)으로 바꾸고 다시 실행해보자.
gdb에 심볼이 없기 때문에 init에 breakpoint를 걸고 다시 vmmap으로 메인에 breakpoint를 걸어서 확인해보자.
4077b에 명령어가 있다.
어떤 값이 들어가는지 확인하고 0x90으로 바꾸자
다음 명령어를 건들면 안되기 때문에 0x7b~0x80까지의 값을 90으로 바꾸자
before
after
exit문을 잘 넘어갔다.
1이아닌 21이 return 돼야 한다고 한다.
606060의 값을 return하고 이 return값을 n에 넣는다
그리고 fgets에서 n값 만큼 s에 입력을 받는다.
일단 바꿔주자.
다시 실행해보니 이 지점에서 segmentation fault가 뜬다.
[rsp] 에는 64bit 주소가 들어가 있지만 32bit 레지스터인 eax에 넣으라고 하니 segmentation fault가 뜨는 것이다.
전부 nop으로 처리하자
이 부분에서는 AVAUA와 hello 값을 비교해서 틀리면 프로그램이 종료된다.
여기서 문자열을 비교한다.
바꿔주자.
0x6b656c6c6f ⇒ 0x4156415541 로 변경..
했더니 실행이 안된다.
got 영역이어서 그런듯 하다.
그냥 이 함수자체를 nop으로 처리하자.
melong이 드디어 떴다.
이제 angr를 사용해서 flag를 출력해보자.
import angr
p = angr.Project('./angrybird')
state = p.factory.blank_state(addr=0x4007b8)
pfs = p.factory.simgr(state)
ex = pfs.explore(find=0x404fab)
print ex.found[0].state.posix.dumps(0)
'CTF Write-up' 카테고리의 다른 글
WITHCON 2016 malloc (0) | 2020.04.18 |
---|---|
Codegate 2016 floppy (0) | 2020.04.18 |
Rooters CTF ch03 Write-up (0) | 2019.10.31 |
Holyshield CTF jmper Write-up (0) | 2019.10.31 |
Rooters CTF vuln Write-up (0) | 2019.10.31 |