23번째 줄을 보면 조건문 안에 or가 있다 이 조건문을 탈출해야 system 함수가 발동된다.
1. buf와 s2 값을 비교해서 같을때
2. discharged_past 값이 550이 아닐때
두 조건을 반대로 만족시켜야 한다.
discharged_past를 살펴보면 메모리 주소가 00 00 00 00 00 40 40 AC 인 것을 확인할 수 있습니다.
일단 위 코드를 보면 buf부터 차례대로 2칸, s 5칸 s2 8칸을 차지합니다.
포맷스트링을 이용해서 공격을 할 것인데 나눠서 설명을 하겠습니다.
%550c: 550칸 띄워준다, 550byte를 확보한다, 550을 입력받는다.
%10%n: 10번째에
AAAAAA: 패딩값, 쓰레기값이다 원하는 값을 10번째에 넣어주려고 했으나 %550~$n까지 총 10칸이므로 rsp(6번째) 메모리 영역을 계산하면 입력받는 s(8번째) 부터 10칸이 찬다. 그러면 9번째를 2칸 오바하게 되고(8바이트 단위기 때문) 남은 6칸을 패딩(쓰레기값)으로 채워주는 것이다.
\xAC\x40\x40\x00\x00\x00\x00\x00: discharged_past의 메모리주소, 리틀엔디안 방식이기에 반대로 넣어준다.
s2값을 찾아보자. 현재 fake값이 들어있는 s2는 rsp(6번째) 부터 buf와 s를 지난 13번째부터 시작된다.
%13$x: 13번째 값을 확인한다.
payload 작성을 해주었다.
p64는 알아서 리틀엔디언으로 바꿔주는 함수다 문자열이 아니고 비트열 형태이기에 앞에 쓴 문자열에 대한 형변환을 b로 진행해 주었다. 필요한 값을 s를 받는 타이밍에 넣어주었다.
여기서 %13$p 로 바뀐 이유는 x가 4바이트밖에 안 받는 똥멍청이다.
파일명에 가독성이 없는 이유는 새벽이기 때문이다. 값이 잘 들어가서 20번째 줄에 있는 printf에서 정상적인 s를 뱉는다.
이 값을 hex to string이라는 사이트에서 돌려주면 리틀엔디언이 적용된 상태로 디코딩된 문자열이 나온다.
논..산이 나왔다...
차마 눈물없이 볼 수 없는 flag였다.
12시간 넘게 주변 사람을 고생시키며 푼 문제였다. 정말 너무 너무 힘들었다...
'시스템 해킹' 카테고리의 다른 글
[Whois] 시스템 해킹 - OOB(Out-Of-Bound) (0) | 2021.12.06 |
---|---|
[Whois] 시스템해킹 - Integer Issues (0) | 2021.12.06 |
[Whois] 시스템해킹 - 버퍼오버플로우3 (0) | 2021.11.23 |
[Whois] 시스템해킹 - 버퍼오버플로우2 (0) | 2021.11.23 |
[Whois] 시스템해킹 - 버퍼오버플로우1 (0) | 2021.11.22 |