티스토리 뷰

 

카테고리

Pwnable

Team having solved this 27, Point 200

 

문제

32 bit elf 바이너리

사용자 정보를 등록하고, 수정하고, 볼 수 있는 프로그램이다.

 

1번 메뉴를 선택했을 때 불리는 creatAcc 함수의 내용이다.

Name, phone number, balance 를 입력 받는다.

이때, Name과 phone number는 문자열, balance는 숫자로 입력 받고,

account의 개수가 maxAcc(0xA)를 넘으면 생성할 수 없다.

 

account ID는 생성한 순서대로 1부터 시작한다.

수정시에는 이 account ID를 이용하여 수정할 account를 선택하고 해당 account의 phone number를 수정할 수 있다.

여기에는 gets함수를 통해 입력 받기 때문에 Overflow 취약점이 발생한다.

"a1 + 108 * v4 + 50"에 입력을 함으로써 덮을 수 있는 값이 어디에 위치한 무엇인지 알 수 있어야 하는데,

a1의 주소는 이렇게 결정되고 i는 스택 영역의 변수다. => a1의 주소를 알 수 없다.

 

3번 메뉴인 View info 의 함수다. 등록된 account 들을 보여준다.

여기서 주목할 점은 Phone Number의 출력이다.

다른 정보들은 포맷 스트링을 이용하여 숫자 또는 문자열로 출력하지만 Phone Number만 포맷 스트링 없이 직접 출력하고 있기 때문에 여기서 FSB(Format String Bug) 가 발생한다.

 

여기서 %x를 출력하면 어떻게 될까?

스택에 있는 값이 나오는데, Name의 정보를 출력할 때 사용한 "a1 + 108 * i"(esp+4)가 나오게 된다.

즉, 스택의 주소를 알 수 있게 된다.

또한 스택의 값을 계속 가져오다보면 입력 값이 출력되는데, 그 위치가 바로 a1의 위치이다. (55번째 쯤부터 나타남)

 

이제 Name 값에 쉘 코드를 올리고, FSB 를 한 번 더 이용하여 다른 함수의 got에 Name 값이 있는 스택의 주소를 Overwrite 하면 해당 함수가 불릴 때 쉘이 뜬다.

 

 

EXPLOIT

 

 

 

 

'해킹 > CTF' 카테고리의 다른 글

[2016 layer7 CTF] UP AND UP !! write-up  (0) 2016.11.04
asdf  (0) 2016.09.14
[WhiteHat Contest 12] Misc002 write-up  (1) 2016.09.11
[2016 Layer7 CTF] ECHO_SYSTEM write-up  (0) 2016.09.06
[2016 Layer7 CTF] EASY UAF write-up  (3) 2016.09.06
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함