八月,袁绍大军向前推进,紧靠沙丘(沙堆)扎营,东西连绵数十里。曹操也分设营垒与袁军对抗。
九月,庚午朔(初一),发生日食。
曹操出兵与袁绍交战,没有取胜,又退回营垒坚守。袁绍建造高台(楼橹),堆起土山,居高临下向曹营射箭,曹军士兵在营中行走都要举着盾牌。曹操于是制造霹雳车(抛石车),发射石块击毁袁绍的高台。袁绍又挖掘地道进攻,曹操就在营内挖深长壕沟来抵御。曹操兵少粮尽,士兵疲惫不堪,百姓也被沉重的赋税压得困苦不堪,许多人背叛曹操,投奔袁绍。曹操非常忧虑,给荀彧写信,说准备退守许都,以引诱袁军深入。荀彧回信说:“袁绍集中全部军队到官渡,打算与您一决胜负。您以最弱的兵力对抗最强的敌军,如果不能制胜,就必定会被敌人乘机击败,这正是决定天下大势的关键时刻!而且,袁绍不过是个布衣(平民)中的英雄罢了,能聚集人才却不能任用。凭您的神明威武和明察事理,再加上辅佐朝廷名正言顺,有什么不能成功的!如今军中粮食虽少,但还没有到楚、汉在荥阳、成皋对峙时那样困难。那时刘邦、项羽谁也不肯先退,因为先退就会在气势上被对方压倒。您以只有敌军十分之一的兵力,划地坚守,扼住敌人咽喉使其不能前进,已有半年之久。现在敌人的力量已经衰竭,内部必将有变。这正是出奇制胜的时机,千万不可错过!”曹操听从了荀彧的意见,于是坚守壁垒与袁绍相持。
曹操见到运粮的士兵,安抚他们说:“再过十五天,我一定为你们打败袁绍,不再让你们劳苦了。”袁绍的运粮车数千辆来到官渡。荀攸对曹操说:“袁绍的运粮车队早晚就要到了,押运的将领韩猛虽然勇猛但轻敌。出兵袭击,可以击败他!”曹操问:“派谁去合适?”荀攸说:“徐晃可以胜任。”于是派偏将军、河东人徐晃与史涣率军半路截击韩猛,击败并赶走了他,烧毁了他押运的辎重。
冬季,十月,袁绍又派车辆运送粮草,命大将淳于琼等率领一万多士兵护送,在袁绍大营北面四十里处宿营。沮授建议袁绍:“可派蒋奇另外率领一支军队在外围巡逻,以防备曹操的偷袭。”袁绍不听。
许攸说:“曹操兵少,而且集中全部力量来抵抗我军,许都的留守兵力一定空虚。如果派一支轻装部队,连夜奔袭,可以攻占许都。攻占许都后,就可以奉迎天子讨伐曹操,曹操必被我们擒获。即使他还没溃败,也能使他首尾不能相顾,疲于奔命,一定能打败他。”袁绍不同意,说:“我一定要先捉住曹操。”这时,正巧许攸家里有人犯法,留守邺城的审配将他们逮捕,许攸大怒,于是投奔曹操。
曹操听说许攸来了,光着脚跑出来迎接他,拍手笑着说:“子卿(许攸字子远)你远道而来,我的大事可成了!”坐下后,许攸问曹操:“袁军势大,你有什么办法对付?现在还有多少粮食?”曹操说:“还可以支持一年。”许攸说:“没有那么多,再说一次!”曹操又说:“可以支持半年。”许攸说:“您不想打败袁绍吗?为什么不说实话!”曹操说:“刚才只是开玩笑罢了。其实只够维持一个月,该怎么办?”许攸说:“您孤军独守,外无救援而粮草已尽,这是危急存亡的时刻啊!袁绍的辎重车队有一万多辆,都停在故市、乌巢(均在今河南延津东南),守军戒备不严。如果派轻装部队偷袭,出其不意地到达,放火烧掉他们的粮草积蓄,不出三天,袁绍大军就会自行溃败。”曹操大喜,于是留下曹洪、荀攸守卫大营,亲自率领步骑兵五千人,打着袁军的旗号,士兵口中衔枚,马嘴用绳子绑住,乘夜从小道出营,每人抱一捆柴草。路上遇到袁军盘问,就回答说:“袁公担心曹操袭击后方辎重,派兵加强戒备。”听的人信以为真,全都毫无戒备。到达乌巢后,包围袁军辎重营地,放起大火。营中顿时惊慌大乱。这时天已渐亮,淳于琼等看到曹军兵少,就在营外摆开阵势。曹操发动猛攻,淳于琼抵挡不住,退守营寨。曹操挥军进攻营寨。
袁绍得知曹操袭击乌巢,对儿子袁谭说:“就算曹操攻破淳于琼,我去攻破他的大营,他就无处可归了!”于是派大将高览、张合等去进攻曹军大营。张合说:“曹操亲率精兵前去袭击,必定能攻破淳于琼等人。淳于琼等一旦被俘,大势就去了。请先去救援淳于琼。”郭图则坚持要先攻曹操大营。张合说:“曹操的大营坚固,进攻未必能攻下。如果淳于琼等被俘,我们这些人就全都要当俘虏了。”袁绍只派少量骑兵去援救淳于琼,而用主力进攻曹营,未能攻下。
袁绍增援的骑兵到达乌巢,曹操左右有人说:“敌人的骑兵逐渐靠近,请分兵抵抗。”曹操大怒道:“敌人到了背后再报告!”士兵们都拼死作战,于是大破袁军,斩杀淳于琼等,将袁绍的全部粮草积蓄烧毁,杀死袁军士兵一千余人,割下他们的鼻子;牛马则割下唇舌,拿去给袁绍军队看。袁军将士无不惊恐。郭图因自己的计策失败感到羞愧,又在袁绍面前诬陷张合说:“张合对我军失利幸灾乐祸。”张合又气又怕,于是与高览烧毁了攻营的器械