min8282

[취약점분석] BOF(시스템 해킹 실습 4일차) 본문

K-Shield.Jr

[취약점분석] BOF(시스템 해킹 실습 4일차)

min8282 2024. 7. 20. 14:36

beefdead로 변경

이전에는 beef

지금까지 출려된 문자열을 개수를 저장한ㄴ녀석 ->%n

이미 출력되어 있는 갯수가 줄어들 수 있나요? 

1BEEF는 만들 수 있겠죠? beef를 만들고 dead를 만들 수 없다.

hn은 2바이트만 사용하기 때문에 1BEEF를 만들면 BEEF만 가지고 온다.

113에 걸고 AAAA 입력

마찬가지로 answer 값 확인

입력값과 관계가 있는 인자부분 확인

r ~~~~ 작성 후 들어간거 확인

answer값이 들어간거 확인

answer값이 beef를 만들기 위해 위처럼 작성

ni 후 answer의 주소값? 작성해서 값 확인. beef 작성완

이제 beefdead를 만들기 위해 hn을 사용 해야함

 

16진수 dead 는 10진수로 57005

16진수 beef는 10진수로 48879

한 번 beef 대신 dead로 값을 바꺼봄

일단 hn을 사용해서 뒤에는 dead로 바꿈

0xbeefdead를 만들기 위한거니까 0xbeefdead를 10진수로 보면 3203391149임

이걸 대입해보니까

0xdeaedead가 나옴. hn으로 2바이트씩 잘랐으니 deae가 3203391149인 것을 알 수 있음.

0xdeae는 10진수로 57006인 것을 확인

0xbeefdead인 3203391149를 넣었을 때 dead.즉, 뒤에 넣을려고 했던것이 나왔으니 beefdead가 아니라 deadbeef로 해서 beef가 주소값에 들어가게 해야함

deadbeef는 10진수로 3735928559임

대입

ni 후 주소의 값을 확인 했는데? 0xdeaedead.

????? 이전에 넣었던거랑 차이가 없다? 고민고민....

 

0xbeefdead를 넣을 때 dead가 beef 보다 크니까 들어갈 수가 없음. 그래서 1beef를 넣는다고 힌트를 주심

0xbeefdead가 아니라 0x1beef를 넣는거임. 

1beef 는 10진수로 114415

앞에 주소 2개 = 8바이트

dead = 56997 을

114415 -4 -4 -56997

처음부터 접근이 잘  ㅇ못

beefdead

ni하면?

continue

clear

하나는 낮은 주소,하나는 높은 주소에다가 쓰면 2바이트를 넣을 수 있다.

멘토님 처럼 8바이트 주소 한 번에 하는 것도 해보기. ㅅㄹ용


bof1.c



A를 540개 쓸  수 있다.

 

이전에 rbp+0x8이 복귀주소인데 이전에는 잘 있다가

A 540개를 넣고

de88을 보니까 41414141로 들어가짐. 복귀주소 덮어버림.

 

 

입력값을 많이 넣어서 복귀주소를 변경시킬 수 있다는 것을 앎.

이제는 you win을 띄우면 됨.

참고로 여긴 64비트

 

버퍼의 시작주소와 바꾸고 싶어하는 거리를 알아야 함.

프린트나 read

두 번째 인자 rsi를 보면 됨.

 

조금 이르긴하지만 python 스크립트 짜야 됨. 디버거 안에서는 못 함.

sen , recv 주의할점)

짝이 맞게 샌드 리시브 해줘야 함. 안 그러면 recv가 계속 기다림.

print(b"aa") 이렇게 바이트 형태로 바꿔야 됨. -> 소켓에서는 우리가 볼 수 있는 언어로 보내면 안 됨. 바이트 인코딩 필수

사소한 꿀팁)read함수는 개행을 문자열 끝으로 인식하지 않음. 개행을 끝으로 인식할 때는 readsend 사용하면 됨. 찾아보셈

tmux 설치

설치 후, tmux 치면 새로운 터미널로 열림

여기서 python 실행하면

 

115에 bp 걸고,

p=connect("IP주소", 포트번호) 원격으로 할 때는 이렿게. 현재는 로컬이니까 그대로 진행.

p = process("./bof1") -> 로컬에서 진행할 때
p = remote("192.xx.xxx.xxx", 8888) -> 외부 실습 때
p = process("./bof1")
# p = remote("192.xx.xx.xx", 8888) // 로컬 환경 아닌 실습 때 사용하세요.

print(p.recv(1024))

payload = b''
payload = b"A" * 0x500
payload += p64(0x1234)

p.send(payload)
print(p.recv(1024))

먼저 win 함수 주소를 확인

rbp de80,

rsp = rbp - 0x200(512) = dc80 

시작주소 = 8

520을 16진수로 변경 0x208

 

win의 주소로 가기 위해 p64(0x4011dd) win 주소

 

설명)

b *main+110


해당 게시글은 복습을 위한 실습 내용 필기이므로 올바르지 않은 정보가 포함되어 있습니다.