HINT : attackme의 소스코드
코드에서 중요한 부분을 보면 프로그램 실행 시 stdin으로 1바이트씩 읽고 있는데,
입력이 0x08인 경우 count의 값이 감소한다.
count는 배열 string의 index를 가리키며,
만약 입력이 정상적인 입력인 경우 string[count] = x 를 해주고 count를 증가시킨다.
이제 gdb로 분석해 보자.
우선 각 버퍼의 위치를 확인해 보자.
소스코드와 gdb를 통해 유추해 보면,
ebp-124 = check , ebp-128 = x, ebp-132 = count 인 것 같다.
적당히 if 분기문에 breakpoint를 걸고 A를 입력하여 어디서 부터 쓰여지는지 확인 해 보았다.
ebp-120이 string의 시작 주소임을 알 수 있다.
정리해 보면,
ebp - 132 = count
ebp - 128 = x
ebp - 124 = check
ebp - 120 = string[]
우리는 check를 0xdeadbeef로 바꿔주어야 하는데,
string이 check 보다 밑에 있어 일반적인 bof방법으로는 string을 통해 check를 덮어 쓸 수 없다.
여기서 우리는 코드에 count를 감소시키는 로직이 있음을 알고있다.
따라서 count를 음수로 만들어 string이 음수 인덱스를 갖게 되면, check의 메모리 영역을 덮어 쓸 수 있을 것이다.
string 부터 check 까지의 크기는 4바이트 이므로,
0x08을 4번 하고 deadbeef를 넣어 주면 될 것 이다.
이제 level 19로 올라가 보자.
[Write-up] Level 20 (0) | 2019.12.10 |
---|---|
[Write-up] Level 19 (0) | 2019.12.10 |
[Write-up] Level 17 (0) | 2019.12.07 |
[Write-up] Level 16 (0) | 2019.12.07 |
[Write-up] Level 15 (0) | 2019.12.07 |
댓글 영역