강의 설명

이번 강의에서는 포맷 스트링과 포맷 스트링 버그에 대해 자세히 알아봅니다.

키워드

• 포맷 스트링(Format String)
• 포맷 스트링 버그(Format String Bug, FSB)
• 형식 지정자(Format Specifier)
강의 목표
포맷 스트링 버그를 이해한다.
이 강의와 관련된 질문들입니다.
19개의 질문
FSB 예제
FSB 예제에 대한 힌트를 받을 수 있을까요 ? 뒤 강의에 나와있는 %[n]$n을 이용해서 푸는 것이라고 생각했는데 계속 Segmentation 에러가 나고 잘 안 되네요... 뒤 예제에서 나온 임시 주소 쓰기 코드를 따라하면 안 되는 건가요 ? 0xff를 써야 하니깐 나와있는 주소 0x7fffffffdddc를 Little Endian으로 만든 다음 %255c%8$nÜÝÿÿÿ이렇게 해줬는데 뭐가 잘못 된걸까요...? 만약 틀렸다면 힌트 부탁 드립니다. 강의만 보고는 이해도 잘 안 되고 어떤 원리인지 잘 이해가 안 갑니다. 다른 방법으로는 %p를 통해서 RDI RSI ... 순서로 흘러간다음 스택 프레임을 사용하는 %7$p까지는 왔는데 여기서 값을 바꾸는 방법을 모르겠습니다.
#시스템해킹
#기초
#포맷_스트링_버그
auth주소랑 %p 인자관련
2가지 질문이 있습니다.. 1. auth 주소 구하는법.. 그냥 모르겠어여 이거는 ㅠㅠ 2. AAAA %p %p %p %p %p %p %p %p %p 입력 넣어서 9번째 %p에서 0x41414141이 출력돼서 buf의 시작 주소가 9번째 인자인건 알겠늗네 함수 호출 규약대로라면 6개는 레지스터에 들어가고 나머지 7개 부터는 스택에 쌓이는 구조인데 왜 7번째랑 8번째에 print stack frame이랑 auth에 있는 값이 나오는거져..? 제가 알고 있는걸로는 printstackframe 형성되고 ret 보다 먼저 인자가 쌓이니까 auth부터 7번째 인자로 나와야되는게 아닌가 헷갈리네여 ㅠㅠ
#시스템해킹
#기초
#포맷_스트링_버그
fsb_aaw 예제에서요..
강의안에 그대로 나와있는데로 복붙해서 컴파일 실행 했는데 secret 주소가 바뀌지 않네요;; #!/usr/bin/python3 # Name: fsb_aaw.py from pwn import * p = process("./fsb_aaw") p.recvuntil("`secret`: ") addr_secret = int(p.recvline()[:-1], 16) fstring = b"%31337c%8n".ljust(16) fstring += p64(addr_secret) p.sendline(fstring) print(p.recvall()) ===> 결과 \x01 \x14\x10\xe09\x9fUSecret: 0' // Name: fsb_aaw.c // Compile: gcc -o fsb_aaw fsb_aaw.c #include <stdio.h> int secret; int main() { char format[0x100]; printf("Address of `secret`: %p\n", &secret); printf("Format: "); scanf("%[^\n]", format);// enter 키를 만날때 까지 읽어라 printf(format); printf("Secret: %d", secret); return 0; } 그대로 복붙했는데 안되는 경우 있으신 분 계신지요;;; ㅠㅠ
#시스템해킹
#기초
#포맷_스트링_버그
정답이 정확히 무엇인지?
\xD0\xDD\xFF\xFF\xFF\x7F\x00\x00%247c%9$n 로 적용하는게 맞는지요.. 아무리해도 fail 이네요
#시스템_해킹
#기초
#포맷_스트링_버그
auth주소
실제 코드를 작성해서가 아닌 figure4 그림에서 auth주소를 어떻게 구하나요? rsp+12라는데 원리를 모르겠어요. ㅠㅠ
#시스템_해킹
#기초
#포맷_스트링_버그
디버거 정보가 맞게 출력 되는 것인가요?
아래는 예제 문제의 출력 값인데요, 디버거에 출력되는 value 값이 제가 입력한 주소 값이 되어야 할 것 같은데 다른 값입니다.. 제가 맞게 풀이한 것일까요? ----------------------------- Win ---------- Debugger ----------- %247c: rdi , value = e0 %9$n: $rsp+16 , value = 7fffffffde0c , write = ff ------------------------------- -------------------------------
#시스템_해킹
#기초
#포맷_스트링_버그
Memory Corruption: Format String Bug 질문
FSB_Easy에서 auth를 0xff로 덮어서 쓰는 방법을 잘 모르겠습니다. %x를 이용해서 하는 것까진 알았는데, auth의 주소에 접근해서 쓰는 법이 감이 잡히지 않습니다.
#시스템
#fsb
포맷 스트링 관련
fig.4의 실습(FSB_EASY)에서 %p %p %p %p %p %p 를 입력하면 rdi, rsi, rdx, rcx, r8, r9 순으로 출력되는데, 왜 그다음 fig.5, 6 부터는 rsi부터 출력되는건가요? printf()의 원래 인자값을 생각하면( 예> printf("%p", buf) , rdi = "%p" 주소, rsi = buf 주소겠죠?) rsi 부터 출력하는 게 맞다는 생각이 들긴 하는데 실습(FSB_EASY)에서는 rdi부터 출력되니 약간 헷갈리네요. rdi부터 출력 or rsi부터 출력, 어떤 게 맞는건가요? 실행 환경에 따라 다른건가요?
#시스템_해킹
#기초
#포맷_스트링_버그
Figure 9. fsb_arr.py 실행 결과
fsb_arr.py에서 실행 결과가 fsb_aar.py가 되어야 할 것 같습니다. Discord에다 report 하라고 했는데, Discord를 쓸 줄 몰라서 여기다 올립니다.
#시스템_해킹
#기초
#포맷_스트링_버그
Figure4 모듈 이상한 점
해결하긴 했는데 풀면서 뭔가 이상하다고 느낀 점이 있어서요 입력에 %p%p%p를 했을 때 ![image.png](https://dreamhack-media.s3.ap-northeast-2.amazonaws.com/attachments/85c0cc25c717d07a950bc8fb62eb191b7f4d4cae9e079f1c2fba02101fb2f6d1.png) 이런 식으로 출력이 나오고 있는데 마치 $1이 rdi를 출력하고 있는 것처럼 보여서요 실제로 %1$d라고 입력했을 때 ![image.png](https://dreamhack-media.s3.ap-northeast-2.amazonaws.com/attachments/5b3f5b01adad22717d41fbd3a18ea8b6fa6b50d8eade4ac33776a5215bdd5b2f.png) 처럼 나오는데 제대로 출력이 되려면 ---------- Debugger--------- %p: rsi , value = 7fffffffdde0 %p: rdx , value = 20 %p: rcx , value = 0x00007ffff7af2151 ---------------------------- 같은 출력이 맞지 않나요? 풀면서 많이 헷갈렸어서요. 혹시 제가 잘못 알고 있다면 알려주시면 감사합니다. 처음 글을 써봐서 가독성이 너무 엉망인 점 죄송합니다..
#시스템_해킹
#기초
#포맷_스트링_버그
printf 인자 질문
printf의 인자로 바꿀 변수의 주소를 먼저 넣고 그 다음에 포맷 스트링을 넣어서 이 포맷 스트링 %n이 buf를 가리키도록 하여, 그 변수의 값을 문자열의 길이로 바꾸게 된다는 것까지 실습을 통해서 배웠습니다. 그렇지만 buf에서 1) 왜 주소값을 먼저 넣고 2) 왜 그 다음에 포맷 스트링을 넣었을 때 되는 것인지 궁금합니다. 뭔가 printf에 비정상적인 방법으로 인자가 들어가서 공격이 성공하는 과정이 원리가 이해되지 않고 암기만 되어 잘 와닿지 않는 것 같습니다. 특히 printf("%s%n", buf, &auth)와 같이 앞에 포맷 스트링을 포함한 문자열이 오고 뒤에 변수들이 따라붙는 일반적인 경우와 굉장히 헷갈립니다. 개인적으로 생각해본 것은 printf의 첫번째 인자가 const char *이라서 첫번째 인자는 주소값까지로 끊기고 이후에 적용되는 것인가...하고 싶습니다.
#시스템_해킹
#기초
#포맷_스트링_버그
figure4 문의
문제 답이 좀 이상하다는 생각이 드는데요. 오프셋 처리에 있어 1 차이 오류?가 있는 것 같습니다. %p %p %p %p %p %p %p %p %p %p %p %p 입력 해보면 스택은 6번째 부터 나와야 하는데 7번째 부터 나오네요. 답도 그래서 1 차이를 주어야 정답으로 처리하는 것 같구요.
#시스템_해킹
#기초
#포맷_스트링_버그
auth 주소가
rsp + 8 인걸 알아내고 이런 input 값을 줬는데 0x7fffffffddd8%247c%8$n 해도 먹히지를 않습니다.. 뭐가 잘못된거죠..
#시스템_해킹
#기초
#포맷_스트링_버그
figure 4 - auth 주소 질문
모듈에서 주어진 0x7fffffffdddc가 auth의 주소가 맞나요? 맞다면 0x7fffffffdddc0000 이렇게 8바이트로 사용을 하면 되나요? 이게 auth의 주소가 아니라면 주소를 어떻게 구해야 하나요?
#시스템_해킹
#기초
#포맷_스트링_버그
주소, 형식 지정자 순서
이전에 figure 4에서는 임의 주소에 쓸 때 (쓸 주소 + %N$n)로 했는데 이후에 figure 6,7 은 이렇게 해도 안되는 이유가 혹시 scanf 널바이트 문제 때문인가요? 6, 7에서는 (%N$s or $N$n + 주소) 형식처럼 주소를 뒤로 하더라구요. 그리고 널바이트 문제가 맞다면 6, 7에서 쓰거나 읽을 주소 중간에 00이 없어서 저렇게 가능했을것 같은데 만약 쓰거나 읽을 주소 중간에 Null 이 있으면 어떻게 하나요? ex) 0x55cf91210054
#시스템_해킹
#기초
#포맷_스트링_버그
질문
[auth 주소]%249%1$n을 하면 auth주소에 있는 값을 변경시킬 수 있는거 아닌가요? 제발 어케하는지 알려주세요 ㅠ
#시스템_해킹
#기초
#포맷_스트링_버그
figure4 질문
%p를 여러번 하여 auth의 위치가 8번째 인것을 찾았습니다. 그래서 %255c%8$n을 하였는데 디버거를 활성화하여 보니까 다음과 같이 되었는데 write = ff라고 되어있어 성공한건줄알았는데 fail이 뜨네요.. 왜그런거죠? ---------- Debugger ----------- %255c: rdi , value = e0 %8$n: $rsp+8 , value = 42424242555547fd, write = ff -------------------------------
#시스템_해킹
#기초
#포맷_스트링_버그
figure4 답
figure4 답이 뭔가요?
#시스템_해킹
#기초
#포맷_스트링_버그
첫실습 부터 막혔네요...
%x를 사용할때마다 주소값이 4 만큼 늘어나는건가요?? 그리고 auth의 주소를 찾았는데 어떻게 0xfffffff로 덮어쓰죠??
#시스템_해킹
#기초
#포맷_스트링_버그
강의 평점
0.0★ (0)
0
Memory Corruption: Format String Bug
0.0★ (0)
Free
상세정보
약 30 minutes 소요
쉬운 난이도
없음