PwNo0b

###Yêu cầu cần thiết

  • Có nền tảng cơ bản về ngôn ngữ Assembly, C (python càng tốt)
  • Biết dùng các loại tool như: IDA, OllyDBG, GDB, radare2,…
  • Kiên trì trước mỗi chal mà ta gặp, nếu đã làm đủ mọi cách mà không solve được thì xem writeup, xem xong phải làm lại sau đó thì có 2 cách
  1. Tìm kiếm những chal khác có tương tự lỗi như vậy và khai thác nó
  2. tự mình viết code C rồi dịch sang assembly để solve
  3. Solved rồi thì các bạn hãy tự nghiệm lại những gì mình học được thông qua chal rồi hãy viết writeup về chal đó cho dù chal đó đã có hàng tá writeup tương tự trên mạng, nhưng vì cái này là bạn viết dành cho bạn nên đâu cần ngại ngùng gì?
  • Nên lập mục tiêu cho bản thân mình VD: 1 ngày ít nhất phải solved 1 chal
  • Quan trọng nhất: Biết tra google

###Knowledge

Vì mới dấn thân vào pwn chưa được lâu nên tôi chỉ có thể tổng kết sơ qua những gì tôi đã tích góp được qua những lần googling bục mặt cho 1 chal. Sau đây là 1 số kiến thức mà tôi sẽ nói,

$ASSEMBLY

Đầu tiên, hãy nói về assembly(hay còn được gọi là hợp ngữ). ASM là ngôn ngữ bậc thấp dùng các mnemonics để viết chỉ thị (instruction) từ mã máy của máy tính (mã nhị phân) //theo techtalk

$STACK

stack hoạt động giống như 1 chồng đĩa vậy, thằng nào vào cuối cùng thì thằng đó được bốc ra đầu tiên hay còn được gọi là phương pháp LIFO (last in, first out)

  • kernel là nơi ta thực hiện command-line param , là cái mà được pass vào chương trình (program) và biến môi trường (environment variable)
  • text là nơi chứa mnemonics, instruction
  • data là nơi chứa biến chưa khởi tạo giá trị (uninitialized variables) và biến đã khởi tạo giá trị (initialized variables)
  • heap là nơi chứa các loại data lớn như images, files,…
  • stack là nơi chứa biến local cho các hàm (function). Khi 1 function được gọi, những biến này sẽ đẩy vào cuối stack

$giải thích quá trình Buffer Overflow

ta có đoạn code sau:

void main(){
char buf[32];
gets(buf);
printf("you typed: %s",bùf);
}
0x0000000000001145 <+0>: push   rbp
0x0000000000001146 <+1>: mov rbp,rsp
0x0000000000001149 <+4>: sub rsp,0x20
0x000000000000114d <+8>: lea rax,[rbp-0x20]
void win(){
printf("you did it!");
}

$format string

để có thể hiểu được lỗi format string này, trước tiên ta phải hiểu được mục đích của nó

#chức năng

  • nó sẽ convert datatypes đơn giản trong ngôn ngữ C thành 1 chuỗi đại diện cho datatypes đó
  • nó cho phép xác định định dạng của chuỗi được đại diện
  • process the resulting string (output to stderr, stdout, syslog, …) (dòng này khó dịch quá LOL)

#cách thức hoạt động

  • format string dùng để control các động thái mà 1 hàm có thể xảy ra
  • nó sẽ xác định loại input mà ta nhập vào như thế nào, sau đó mới in nó ra
  • các input đó (hay còn gọi là parameters) được push vào stack của chương trình
  • được lưu 1 cách trực tiếp (giá trị), hay gián tiếp (địa chỉ)\

#sự liên quan của stack đối với format string (FS)

VD: ta có đoạn code sau

#format string vulnerability

để có thể rõ ràng hơn ta sẽ viết thử 1 đoạn code đơn giản để làm rõ các ký tự trên

Related:

https://bitvijays.github.io/LFC-BinaryExploitation.html

những page có thể luyện pwnable:

https://pwnable.kr

--

--

Love podcasts or audiobooks? Learn on the go with our new app.

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store